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

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

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

【问题讨论】:

    标签: spring-boot java-8 activemq


    【解决方案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 个实例并尝试同步外部资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多