`
y806839048
  • 浏览: 1126187 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

ActiveMQ多个消费者消费不均匀问题

阅读更多

先上图

 

 

 

如果客户端处理很慢的话,Broker会在之前发送消息的反馈之前,继续发送新的消息到客户端。如果客户端依旧很慢的话,没有得到确认反馈的消息会持续增长。在这种情况下,Broker有可能会停止发送消息给消费者。当未被反馈的消息达到了prefetch limit设置的数字时,Broker将会停止给消费者发送新的消息。除非消费者开始给与反馈,否则得不到任何消息。

 

 

 

 

Default Prefetch Limit(默认预取限制):不同的消费者类型有不同的默认设置,具体设置如下:

 

 

 

Queue consumer:默认1000

 

              如果你使用一组消费者进行分散工作量的话(一个Queue对应多个消费者),典型的你应该把数字设置的小一些。如果一个消费者被允许可以聚集大量的未被确认的消息的话,会导致其它的消费者无事可做。同时,如果这个消费者出错的话,会导致大量的消息不能被处理,直到消费者恢复之前。

 

Queue browser:默认500

 

Topic consumer:默认32766

 

      默认值32766是数字short的最大值,也是预取限制的最大值。

 

Durable topic subscriber:默认100

 

       通常你可以通过增加预取限制来改善性能。

 

 

Optimizing prefetch limits(优化预取限制):通常的,优化Queue消费和持久化主题订阅者(durable topic subscriber)是个好主意。

 

Queue consumers—如果你的queue只有一个消费者的话,你可以设置预取限制为一个相当大的值。但,如果一个queue有一组消费者的话,你最好限制到一个比较小的数字上,比如0或者1.

Durable topic subscribers—通常增大预取限制的数量会提高性能。尝试一下增加到1000.

 

How to set prefectch limits(如何设置预取限制):你可以在Broker端或者消费者端设置预取制限。这有三种粒度的设置方式。如下:

 

 

java写法

 

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();

 

Properties props = new Properties();

props.setProperty("prefetchPolicy.queuePrefetch", "1000");

props.setProperty("prefetchPolicy.queueBrowserPrefetch", "500");

props.setProperty("prefetchPolicy.durableTopicPrefetch", "100");

props.setProperty("prefetchPolicy.topicPrefetch", "32766");

 

factory.setProperties(props);

 

 

Per destination:一个最好的粒度,你可以在创建消费者的时候设置每个目的的预取限制。消费queue,TEST.QUEUE,时指定预取限制为10.创建MessageConsumer 实例的代码如下:

 

 

 

Queue queue = 

  new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10");

 

MessageConsumer consumer = session.createConsumer(queue);

 

分享到:
评论

相关推荐

    ActiveMQ高并发处理方案

    默认情况下,每个消费者的预取数量为1000条,这意味着在没有特别配置的情况下,消费者将预取最多1000条消息到本地缓冲区中。当一个消费者处理速度较慢时,其他消费者即使空闲也无法获得新消息处理。 ##### 解决方法...

    7道消息队列ActiveMQ面试题!

    在发布/订阅模式中,消息生产者发布消息到主题(Topic),多个消费者可以订阅该主题,接收消息。 2. ActiveMQ的存储机制和故障处理 ActiveMQ的存储机制包括非持久化消息和持久化消息两种方式。非持久化消息存储在...

    ActiveMQ消息中间件面试专题1

    解决方法是将prefetch值设为1,让每个消费者每次只处理一条消息,以保证消息均衡分配。 6. 死信队列的使用 死信队列是在消息处理失败时,不被立即删除而是保留下来供后续处理的队列。通过设置死信队列,可以确保...

    ActiveMQ实例,源代码

    - **负载均衡(Load Balancing)**:ActiveMQ 可以配置多个消费者,消息会均匀分布到所有消费者,提高处理效率。 - **网络连接(Network of Brokers)**:ActiveMQ 支持多代理间的连接,形成网络,允许消息跨服务器传输...

    多个spring 和ActiveMQ结合的项目

    6. **负载均衡和故障转移**:当有多个Spring应用实例时,可以使用ActiveMQ的负载均衡特性,确保消息在集群中的多个实例间均匀分布。此外,ActiveMQ的网络连接器功能可以实现故障转移,当主服务器宕机时,消息路由至...

    消息队列activeMQ

    - **负载均衡**:消息可以根据策略均匀分配到多个消费者,提高系统性能。 - **安全机制**:ActiveMQ提供用户认证和授权功能,可以对消息访问进行控制。 ### 3. ActiveMQ的使用 在"ActiveMQDemo1"这个示例中,我们...

    java消息中间件教程-activemq

    - 观察生产者发送的消息如何被多个消费者均匀分配。 - **4-4 主题模式的消息演示** - 主题模式与队列模式类似,但在创建消息目标时有所不同。 - 在主题模式下,消费者无法接收到在启动前由生产者产生的消息。 - ...

    ActiveMQ消息中间件面试题.pdf

    在某些场景下,可能遇到多个消费者之间消息分发不均衡的问题,即一个消费者处理了大部分甚至全部消息,而其他消费者几乎没有参与处理。这主要是由于ActiveMQ的预取(Prefetch)机制导致的: - 默认情况下,消费者一...

    ActiveMQ面试专题.docx

    消费者一次性获取多条消息,如果未确认消费,消息不会被重新分配。为解决此问题,可以调整prefetch值为1,使得每次仅处理一条消息。 5. **死信队列** 当消息处理失败时,可以通过不使用 AUTO_ACKNOWLEDGE 模式,...

    ActiveMQ实例---分布式发送邮件

    而在发布/订阅模式下,一个消息可以被多个消费者接收。 接下来,我们分析文件名列表:edu-demo-mqproducer、edu-common-parent、edu-demo-mqconsumer。这似乎是一个教育相关的项目,包含生产者(mqproducer)、公共...

    2021Java字节跳动面试题——面向字节_ActiveMQ.pdf

    - **Prefetch 机制**:默认情况下,消费者一次性获取多条消息(通常是 1000 条)。 - **消息状态**:获取的消息在未被确认前处于“已分配未消费”状态,不会被其他消费者获取。 - **解决方案**:将 prefetch 数量...

    ActiveMQ延迟发送

    3. 负载均衡:通过设置消费者策略,如FairDispatch或RoundRobinDispatch,可以实现消息在消费者之间的均匀分配。 4. 容错机制:当一个节点故障时,其他节点能接管其工作,保证服务不中断。 综上所述,ActiveMQ的...

    ActiveMQ消息中间件面试专题.pdf

    - 调整消费者的工作负载,确保每个消费者都能均衡地分担任务。 #### 六、死信队列 - **概念**:死信队列是指消息因处理失败等原因而无法被正常消费时,被转移到的特殊队列,以便后续进一步处理或重试。 - **实现...

    activemq-transport-jrms-1.2.jar.zip

    2. **负载均衡**:当多个消费者订阅同一主题时,消息可以均匀分配,实现负载均衡。 3. **容错机制**:如果消息生产者或消费者出现问题,消息可以暂存于队列中,待问题解决后继续处理,增强了系统的可靠性。 4. **...

    apache-activemq-5.0.0

    ActiveMQ可以通过网络分发负载,将消息均匀地分配到多个消费者之间,提高系统性能和稳定性。 **5. 安全性** ActiveMQ提供了用户认证和授权机制,可以配置访问控制策略,保护消息传递的安全性。通过SSL/TLS加密,...

    4.3、多线程consumer 访问集群 static快(两个broker)1

    这里的"static"指的是ActiveMQ的静态连接器配置,它保证了消息均衡地分发到多个消费者,即使在消费者或Broker故障时也能保持高可用性。在这种配置下,当消费者连接到Broker时,它们会被分配到一个特定的队列副本,...

    mq-demo 初始代码

    6. **负载均衡**:MQ可以实现负载均衡,通过将消息均匀地分发到多个消费者,避免单点压力过大。 7. **容错与高可用**:MQ系统通常提供冗余和故障切换机制,确保即使部分组件失效,也能保证服务连续性。 8. **消息...

    11_如果让你来开发一个消息队列中间件,你会怎么设计架构?.zip

    - **发布/订阅(Pub/Sub)**:多个消费者可以订阅同一主题,适合一对多广播。 2. **持久化**: - **消息持久化**:确保在网络故障或服务重启后不丢失消息,这需要在内存和磁盘之间进行平衡。 - **事务支持**:...

    mq-连接管理

    在这个模型中,生产者发布消息到一个主题,多个消费者可以订阅这个主题,从而接收消息。这种方式允许一对多的消息传递,适合广播或者通知类场景。 5. **连接监控**:"mq-monitor.txt"可能包含了关于MQ连接状态的...

    Kafka核心原理与实战

    - 一个Consumer Group是由多个消费者组成的组。 - 每个Consumer Group内的成员共同消费一个Topic。 - 确保一个Topic的消息被不同Consumer Group内的成员均匀消费。 11. **Kafka Controller** - Kafka集群中有一...

Global site tag (gtag.js) - Google Analytics