【问题标题】:How to improve message processing with large queues?如何改进大队列的消息处理?
【发布时间】:2019-04-24 04:59:39
【问题描述】:

我正在尝试使用 Spring JMS 和 ActiveMQ 来处理大量消息。问题的上下文如下: 每个客户都会生成一组添加到队列中的消息。消息以客户 ID 作为参数添加到队列中。

在一种情况下,客户 A 可以将 10k 条消息添加到队列中,而客户 B 仅将 100 条消息添加到同一队列中。我的问题是客户 B 需要等到所有 10k 条消息都完成处理后,才能处理其 100 条消息。

有没有办法同时处理客户A的一些消息和客户B的一些消息?我知道可以选择对来自客户 B 的消息设置更高的优先级,但是当有更多客户时,这并不能解决问题。拥有更多消息的客户将填满队列,而其他人则必须等待。

如果您能提供一些帮助或建议,我将不胜感激。

【问题讨论】:

    标签: activemq spring-jms


    【解决方案1】:

    队列的基本语义是先进先出(即 FIFO)。没有真正的方法可以逃避这一点。我建议您重新设计您的应用程序以使用多个队列 - 每个“类型”的消息或您拥有的独立应用程序一个。

    【讨论】:

    • 感谢您的回答。我正在考虑为每个客户动态创建队列。该选项的问题是我看不到如何使用 JMSTemplate 列出队列。您还知道是否可以将消费者动态分配给队列。从外观上看,消费者始终与给定队列相关联。
    • 我对 Spring 的 JMSTemplate 不是很熟悉。我的印象是它适用于一组狭窄的用例,但它不是很灵活。我可能是错的。我建议您创建一个新问题,让专家提供一些指导。
    • 感谢您的快速反馈@Justin Bertram
    【解决方案2】:

    我想说你可以微调你的 activemq 批量处理的消息数量。此外,还有一些方法可以微调给定的代理和队列。更多详情请参考此链接:

    http://activemq.apache.org/performance-tuning

    https://access.redhat.com/documentation/en-US/Fuse_ESB/4.4.1/html-single/ActiveMQ_Tuning_Guide/index.html

    【讨论】:

    • 感谢您的反馈,但这并没有真正的帮助。这只会有助于更快地处理消息,而不是同时处理不同的客户。
    【解决方案3】:

    我想我已经找到了问题的解决方案。它涉及使用消息组。对于每条消息,我将属性 JMSXGroupID 设置为客户的标识符。

    由于它们是多个消息组,队列负责将来自不同组的消息分配给不同的消费者。这样,客户 B 的文件就可以在处理客户 A 的文件的同时得到处理。

    【讨论】:

    • 队列的语义仍然是先进先出。换句话说,一个组的消息不能在它前面的组中的消息之前被处理。
    • 我同意这个@JustinBertram,它仍然是先进先出。但是,我对应用程序处理工作流程进行了更改。客户 A 和客户 B 仍然存在,但是我创建了与消息组关联的小批量 10 条消息。因此,来自客户 A 和 B 的消息可以同时处理。来自 A 的 10k 条消息将分 100 组扇出,而来自 B 的 100 条消息将分 10 组扇出。理论上,这些组由不同的消费者处理,因此来自 A 和 B 的消息应该同时处理。
    猜你喜欢
    • 2023-02-10
    • 2015-12-16
    • 2020-02-17
    • 2014-09-04
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多