Spring ActiveMQ增加消息使用率

问题描述 投票:0回答:1

我们正在使用ACTIVEMQ作为消息代理。对于其中一个队列,我们​​发现生成消息的速率远高于消耗消息的速率。有时这会导致ACTIVEMQ崩溃。

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

以下是当前侦听器配置

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setConcurrency("1-1");

        factory.setMessageConverter(jacksonJmsMessageConverter());
        return factory;
    }

侦听器逻辑与数据库多次交互,并且可以被视为I / O绑定任务。因此,我们正在考虑并行处理多个消息。

我们找到了以下选项。

  1. 我们已同意1-1的暗示concurrentConsumers and maxConcurrentConsumers为1,一次仅处理1条消息。这是配置,我们可以增加为5-10,以便最小5和最大10个使用者可以同时运行。

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

  3. 我不确定采用哪个选项(1或2)

  4. 如果将并发性提高到5-10,并且还设置了ThreadPoolExecutor,其行为和影响是什么?
  5. 是否有选择最佳参数的指针?
java spring jms activemq
1个回答
0
投票

DefaultMessageListenerContainer.setTaskExecutor()的JavaDoc这样说:

设置Spring DefaultMessageListenerContainer.setTaskExecutor()以用于运行侦听器线程。

默认为TaskExecutor,根据指定的并发使用者数,启动多个新线程。

指定用于与现有线程池集成的替代方法SimpleAsyncTaskExecutor。请注意,这仅在以特定方式(例如在Java EE环境中)管理线程时才真正增加价值。普通线程池不会增加太多价值,因为此侦听器容器在其整个生命周期内都会占用许多线程。

因此,设置任务执行程序的主要用例是与现有线程池集成。默认执行程序已经根据您配置的并发使用者的数量进行扩展。因此,我不建议您设置任务执行器。

我建议仅设置并发。

您需要通过仔细的基准测试和分析来确定最佳值。在开始该过程之前,我强烈建议您设置一个特定的性能目标,因为没有目标,基准测试和优化就可能成为无休止的任务。

您可能还考虑使用SimpleAsyncTaskExecutor,以便队列首先不会变得很满。

© www.soinside.com 2019 - 2024. All rights reserved.