Java 提高消息消耗率
我们使用ActiveMQ作为消息代理 对于其中一个队列,我们发现生成消息的速率远远高于消耗消息的速率。这有时会导致ActiveMQ崩溃 因此,我们正在探索提高消费率的方案。(首要任务是提高现有消费者的比率,然后增加消费者吊舱/实例的数量) 以下是当前侦听器配置Java 提高消息消耗率,java,jms,activemq,spring-jms,Java,Jms,Activemq,Spring Jms,我们使用ActiveMQ作为消息代理 对于其中一个队列,我们发现生成消息的速率远远高于消耗消息的速率。这有时会导致ActiveMQ崩溃 因此,我们正在探索提高消费率的方案。(首要任务是提高现有消费者的比率,然后增加消费者吊舱/实例的数量) 以下是当前侦听器配置 @Bean 公共默认jmsListenerContainerFactory jmsListenerContainerFactory(){ DefaultJmsListenerContainerFactory=新的DefaultJmsLis
@Bean
公共默认jmsListenerContainerFactory jmsListenerContainerFactory(){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
setConnectionFactory(connectionFactory());
factory.setConcurrency(“1-1”);
setMessageConverter(jacksonJmsMessageConverter());
返回工厂;
}
侦听器逻辑与数据库进行多次交互,可以被限定为I/O绑定任务。因此,我们正在考虑并行处理多条消息
我们发现了以下选项
1-1
,这意味着
concurrentConsumers
和maxConcurrentConsumers
为1,一次只处理1条消息。这是我们可以增加的配置,即5-10
,以便最小5个和最大10个用户能够同时运行TaskExecutor
。与设置threadPoolExecutor(corePoolSize=5,maxPoolSize=10,queueCapacity=50)类似,
也将帮助我们同时处理消息TaskExecutor
设置为用于运行侦听器线程
默认值是,根据指定数量的并发使用者启动多个新线程
指定与现有线程池集成的备选TaskExecutor
。请注意,只有当线程以特定方式管理时(例如在JavaEE环境中),这才真正增加了价值。普通线程池不会增加太多价值,因为此侦听器容器在其整个生命周期中将占用大量线程
因此,设置任务执行器的主要用例是与现有线程池集成。默认执行器将根据您配置的并发使用者的数量进行扩展。因此,我不建议您设置任务执行器
我建议只设置并发性
您需要通过仔细的基准测试和分析来确定最佳值。在你开始这个过程之前,我强烈建议你设定一个具体的绩效目标,因为没有目标,基准测试和优化可能会成为无休止的任务
你也可以考虑使用队列,这样队列就不会太满了。
你在MSG/S和MB/S中观察到的吞吐量是什么?
根据我的经验,您将看到使用直接JMS API通过PooledConnectionFactory对事务进行批处理时,吞吐量最快。springjms模板可能很难配置和调优,尤其是使用多线程和事务。它还可以关闭每个消息上的使用者和会话等对象,从而消除了代理端缓存和预取的好处当您直接使用JMS-API和批处理事务(JMS,不一定是XA)时,您将受益于ActiveMQ代理的服务器端缓存和预取——这将产生巨大的差异 我同意前面的答案 当Spring DefaultMessageListenerContainer(DMLC)的消息使用性能较差时,这几乎总是意味着每次读取消息时都会重新创建JMS使用者/会话/连接 在非事务处理的情况下,您可以让DMLC缓存消费者。DMLC将使用单个JMS连接,并在该连接上启动多个JMS会话。每个会话将有一个JMS消息使用者 在事务处理的情况下,DMLC中没有缓存,必须使用缓存连接工厂以避免性能问题。查看
org.apache.activemq.pool.PooledConnectionFactory
或org.messaginghub.pooled.jms.JmsPoolConnectionFactory
,了解此功能
至于您的问题,我也不想为任务执行器操心。首先,我建议并发性为5-5
。我发现,最小和最大消费者数量相同(只是有一个固定的池)在稳定性和性能方面具有优势
至于ActiveMQ崩溃,这是由于ActiveMQ预取。默认情况下,ActiveMQ的预取值为1000。JMS消息使用者请求消息,而代理在预回迁中传递消息和其他消息。如果消费者/会话随后关闭,则在客户端丢弃999条消息,然后在代理上重新排队。这对经纪人来说是非常滥用的,而且处理得不是很好
此外,请注意,例如,如果您有5个并发消费者,那么第一个消费者将获得1000条消息,然后下一个消费者将获得1000条消息,依此类推。因此,如果队列中只有500条消息,那么只有一个消费者处于活动状态。您需要队列中有5000条消息才能激活所有5个消费者
如有疑问,请在客户端配置中禁用消息预取:
tcp://broker_uri:61616?jms.prefetchPolicy.all=0
您是否知道您可以而且应该正确回答您的问题?