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 应用程序中禁用 Spring JMS 自动配置
Spring Boot JMS 侦听器:无法刷新目标的 JMS 连接