【发布时间】:2020-05-10 22:40:44
【问题描述】:
我们使用 ActiveMQ 作为我们的消息代理。
对于其中一个队列,我们发现生成消息的速率远高于消耗消息的速率。这有时会导致 ActiveMQ 崩溃。
因此,我们正在探索提高消耗率的选项。 (首要任务是提高现有消费者的比率,然后增加消费者 pod/实例的数量)。
以下是当前监听配置
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrency("1-1");
factory.setMessageConverter(jacksonJmsMessageConverter());
return factory;
}
侦听器逻辑与数据库多次交互,可以限定为 I/O 绑定任务。所以我们正在考虑并行处理多条消息。
我们找到了以下选项。
我们已将并发设置为
1-1,这意味着concurrentConsumers和maxConcurrentConsumers为 1,一次只处理 1 条消息。这是我们可以增加为5-10的配置,这样最少 5 个和最多 10 个消费者将能够同时操作。我们还发现在监听器工厂中也可以设置
TaskExecutor。像设置一个threadPoolExecutor (corePoolSize = 5, maxPoolSize = 10, queueCapacity=50)也可以帮助我们并发处理消息。我不确定使用哪个选项(1 或 2)
- 如果我们将并发增加到 5-10 并设置一个 ThreadPoolExecutor,会有什么行为和影响?
- 在选择参数的最佳值方面有什么建议吗?
【问题讨论】:
-
您知道您可以而且应该accept an answer 正确回答您的问题吗?
标签: java jms activemq spring-jms