本文主要介绍一下ActiveMQ消息独占模式
1、消息独占模式(Exclusive Consumer)
Queue中的消息是按照顺序被分发到consumers的。然而,当你有多个consumers同时从相同的queue中提取消息时,你将失去这个保证。因为这些消息是被多个线程并发的处理。有的时候,保证消息按照顺序处理是很重要的。例如,你可能不希望在插入订单操作结束之前执行更新这个订单的操作。 ActiveMQ从4.x版本起开始支持Exclusive Consumer (或者说Exclusive Queues)。 Broker会从多个consumers中挑选一个consumer来处理queue中所有的消息,从而保证了消息的有序处理。如果这个consumer失效,那么broker会自动切换到其它的consumer。 可以通过Destination Options 来创建一个Exclusive Consumer,如下:
Java代码
1. queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true");
2. consumer = session.createConsumer(queue);
顺便说一下,可以给consumer设置优先级,以便针对网络情况(如network hops)进行优化,如下:
Java代码
1. queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true &consumer.priority=10");
2、支持负载均衡的消息的顺序消费思路
(1)以一个订单产生为例,用户进行下单时会产生订单,订单生成成功,则需要减库存等一系列操作。类似上述场景都需要消息顺序高效的执行。
(2)如果使用独占消费者模式可以解决顺序消费的问题,但是如果当订单量非常庞大时,每次消息中间上的数据只能交给一个消费者去处理,这样效率就会很低。
(3)解决这个问题的思路是,可以在消息中间件(Broker)与Consumer之间添加一个集群(cluster,代理服务器角色)该集群主要目的用于将broker上的消息进行排队,该cluster的大致设计是可以创建一个ConcurrentHashMap的队列,队列的key可以使用String类型的订单ID,value可以使用一个ConcurrentLinkedQueue的队列。这样每次通过一些业务逻辑处理,将代理服务器的消息推送给每一个Consumer(这里的Consumer也可以是一个集群),对于每一个Consumer而言,在处理一个订单数据时,每处理完一个订单里的一条消息时都要将消息的返回结果通知代理服务器,代理服务器得知订单中消息的处理情况后,就可以将同一个订单中的第二条数据推送给另外一个Consumer,第二个Consumer的处理逻辑与第一个的相同。这样处理方式可以保证每一个订单的数据消息都是顺序执行的。在这个期间对于第一个Cosumer而言,还可以并发处理第二个订单中的消息。对于整个系统而言,顺序处理消息的时间可能没有特别大的变化,但是对于整个系统而言,系统的吞吐量变大了。
相关推荐
这种模式确保了消息的有序性和幂等性,适合处理有顺序要求或者需要独占处理的任务。 ### 2. 事务(Transactions) 在ActiveMQ中,事务提供了消息发送的原子性。通过开启事务,多个消息可以在一个事务中发送,只有...
7. **公平分配策略**:在多消费者的情况下,ActiveMQ支持公平分配策略,确保每个消费者都有机会接收消息,而不是由一个消费者独占队列。 8. **预取策略**:为了提高效率,消费者通常会预先从队列中拉取消息,这被...
点对点模式下,消息会被一个消费者独占;发布/订阅模式下,多个订阅者会接收到消息。 5. **配置与安全性**: 在实际应用中,你可能需要配置ActiveMQ的网络设置、存储策略、日志级别等。此外,安全性也是一个重要的...
- 消费者模式:有独占、共享和Durable订阅三种模式,根据需求选择合适的消费方式。 6. **应用场景** - 微服务通信:在微服务架构中,ActiveMQ可以作为服务间通信的桥梁,实现异步解耦。 - 数据集成:在不同系统...
- **定义:** 指定特定消费者为独占消费者,只允许它处理消息。 **7.5 消息重发策略:** - **定义:** 控制消息何时何地重新发送的策略。 - **配置:** 可以设置重试次数和间隔时间。 **7.6 目标相关的属性:** - **...
4. 创建会话:在连接上创建一个会话,可以设置事务支持和独占模式。 ```csharp var session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); ``` 5. 创建目的地:定义消息的目标,可以是主题...
本DEMO将深入探讨ActiveMQ中的两种主要通信模式:点对点(Point-to-Point,P2P)模型和发布/订阅(Publish/Subscribe,Pub/Sub)模型。 一、点对点(P2P)通信方式 1. 基本概念:在P2P模型中,消息从一个生产者...
每个消息仅被一个消费者消费,确保了消息的顺序性和独占性。 - **发布/订阅模型**:消息从生产者发布到一个主题,多个订阅者可以订阅该主题并接收消息。每个订阅者都可以接收到消息的副本,实现了广播式通信。 2...
每个消息只能被一个消费者消费,确保消息的独占性。ActiveMQ中的队列实现了这种模型,确保消息的可靠传输。 在"jms_chat"这个文件中,可能包含了一个简单的聊天应用程序的示例。通常,这个应用会模拟用户发送消息到...
这种模式强调消息的有序性和独占性,确保每条消息只被一个消费者接收。在ActiveMQ中,我们可以通过创建`Queue`对象来实现这一点。 2. **发布/订阅通信模式(Publish/Subscribe, Pub/Sub)** 在发布/订阅模式中,...
- 公平消费是指在多消费者竞争同一队列时,ActiveMQ会尽可能保证消息分配的公平性,即每个消费者有机会消费消息,而不是被某一个消费者独占。 7. **如何解决ActiveMQ的性能瓶颈问题?** - 优化网络连接:减少网络...
每个消息只有一个消费者,因此是独占的。在代码中,我们可能会看到以下关键概念: 1. `ConnectionFactory`:这是创建连接到消息代理的工厂类,通过它我们可以创建`Connection`对象。 2. `Connection`:代表与...
ActiveMQ的prefetch机制可能导致消息被一个消费者独占,从而影响消息的负载均衡。为了解决这个问题,可以通过调整prefetch的数量,使消费者逐条获取消息,从而达到更均匀的消息消费。 最后,死信队列提供了一种处理...
然而,这里出现了一个问题:如果一个消费者先启动并开始读取消息,它可能会独占所有消息,除非有回流机制。在本例中,由于61617端口的消费者采用了静态分配,它接收到的消息比61616端口的消费者多,这表明静态分配...
队列中的每条消息仅被一个消费者消费,实现消息的独占性。在代码实现中,你需要创建生产者和消费者类,使用MQ提供的API来发送和接收消息。 对于订阅者队列(Publish/Subscribe,一对多),消息发布者将消息发送到...
队列支持点对点(Point-to-Point)的消息传递模式,而主题则支持发布/订阅(Publish/Subscribe)模式。 #### 版本与版权 JMS规范版本1.1于2002年4月12日发布,由Sun Microsystems的多位杰出工程师共同参与制定,...
- **排他锁/写锁**: 独占锁,只能有一个线程对数据进行写操作。 - **行锁**: 锁住单行记录。 - **表锁**: 锁住整个表。 - **悲观锁**: 认为数据会发生冲突,因此锁定数据。 - **乐观锁**: 认为数据不会发生冲突,...