Spring Boot 中 JMS 消费者的动态缩放

Posted

技术标签:

【中文标题】Spring Boot 中 JMS 消费者的动态缩放【英文标题】:Dynamic scaling of JMS consumer in spring boot 【发布时间】:2017-08-19 22:54:04 【问题描述】:

我正在尝试构建一个 spring-boot 应用程序,它将从 activeMQ 生产者读取数据。我希望客户可用的资源达到最佳状态。在我的 spring-boot 应用程序中,我想配置多个消费者,所有这些消费者都将连接到一个队列。

他们是我可以在 sprint-boot 应用程序上动态扩展和缩减消费者的一种方式吗?

【问题讨论】:

【参考方案1】:

您所说的消费者是DefaultMessageListenerContainer 的不同线程还是DefaultMessageListenerContainer 的不同实例?

您可以通过更改来动态增加和减少 DefaultMessageListenerContainer 的线程数

org.springframework.jms.listener.DefaultMessageListenerContainer.concurrentConsumers

org.springframework.jms.listener.DefaultMessageListenerContainer.maxConcurrentConsumers 相应地

更新

如果您使用多个消费者和/或线程,则需要调整 prefetchPolicy。

persistent queues (default value: 1000)
non-persistent queues (default value: 1000)
persistent topics (default value: 100)
non-persistent topics (default value: Short.MAX_VALUE - 1)

所有消息都被分派给第一个连接的消费者,而当另一个消费者连接时,他不会收到消息,因此如果您有队列的并发消费者,则要更改此行为,您需要将 prefetchPolicy 设置为低于默认值的值。例如,将此jms.prefetchPolicy.queuePrefetch=1 添加到 activemq.xml 中的 uri 配置中,或者像这样在客户端 url 上设置它

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://172.16.143.99:61616?jms.prefetchPolicy.queuePrefetch=1");

建议使用较大的预取值以获得高性能和高 消息量。但是,对于较低的消息量,每个 消息需要很长时间来处理,预取应该设置为 1。 这确保了消费者一次只处理一条消息。 但是,将预取限制指定为零会导致消费者 一次轮询消息,而不是消息 推送给消费者。

看看http://activemq.apache.org/what-is-the-prefetch-limit-for.html

还有

http://activemq.apache.org/destination-options.html

【讨论】:

我有同一个应用程序的多个实例,我打算在每个实例中创建多个消费者。这是最佳解决方案吗? 同一个 DMLC 实例中的多个线程可以,但为什么要从单个队列中消费多个 DMLC(消费者)实例和应用程序? 维护这些实例的故障安全。如果使用 DMLC 配置的实例出现故障,则消息处理将停止。 ok,如果不同的 DMLC 实例在不同的集群或服务器中运行 是的,我在不同的机器上有 3 个实例并尝试同步外部资源。

以上是关于Spring Boot 中 JMS 消费者的动态缩放的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot activeMQ 设置并行消费

在 Spring Boot 应用程序中禁用 Spring JMS 自动配置

Spring Boot JMS 侦听器:无法刷新目标的 JMS 连接

Spring-boot JMS 发送消息慢的问题解决

Spring-boot 应用程序通过 WebSocket 在 WebPage 上显示 JMS 消息

使用spring集成确保jms消费者关闭的正确方法是啥?