Java 提高消息消耗率

Java 提高消息消耗率,java,jms,activemq,spring-jms,Java,Jms,Activemq,Spring Jms,我们使用ActiveMQ作为消息代理 对于其中一个队列,我们发现生成消息的速率远远高于消耗消息的速率。这有时会导致ActiveMQ崩溃 因此,我们正在探索提高消费率的方案。(首要任务是提高现有消费者的比率,然后增加消费者吊舱/实例的数量) 以下是当前侦听器配置 @Bean 公共默认jmsListenerContainerFactory jmsListenerContainerFactory(){ DefaultJmsListenerContainerFactory=新的DefaultJmsLis

我们使用ActiveMQ作为消息代理

对于其中一个队列,我们发现生成消息的速率远远高于消耗消息的速率。这有时会导致ActiveMQ崩溃

因此,我们正在探索提高消费率的方案。(首要任务是提高现有消费者的比率,然后增加消费者吊舱/实例的数量)

以下是当前侦听器配置

@Bean
公共默认jmsListenerContainerFactory jmsListenerContainerFactory(){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
setConnectionFactory(connectionFactory());
factory.setConcurrency(“1-1”);
setMessageConverter(jacksonJmsMessageConverter());
返回工厂;
}
侦听器逻辑与数据库进行多次交互,可以被限定为I/O绑定任务。因此,我们正在考虑并行处理多条消息

我们发现了以下选项

  • 我们已将concurreny设置为
    1-1
    ,这意味着
    concurrentConsumers
    maxConcurrentConsumers
    为1,一次只处理1条消息。这是我们可以增加的配置,即
    5-10
    ,以便最小5个和最大10个用户能够同时运行

  • 我们还发现,我们还可以在侦听器工厂中设置
    TaskExecutor
    。与设置
    threadPoolExecutor(corePoolSize=5,maxPoolSize=10,queueCapacity=50)类似,
    也将帮助我们同时处理消息

  • 我不确定采用哪种选择(1或2)

  • 如果我们将并发性增加到5-10,并设置ThreadPoolExecutor,那么行为和影响会是什么
  • 在选择参数的最佳值时有什么提示吗
  • JavaDoc for表示:

    将Spring
    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

    您是否知道您可以而且应该正确回答您的问题?