【发布时间】:2016-04-24 09:32:11
【问题描述】:
我们有一个代表多个客户工作的分布式应用程序。现在,随着工作的到来,消息被放在一个队列中。消息按 FIFO 顺序拉出,这在大多数情况下都可以正常工作。
在某些情况下,我们会为单个客户端获取数千条消息,然后占用队列中的前一千多个插槽。这意味着在处理这些消息之前,无法为任何其他客户端完成任何(或很少)工作 - 这会使较小的客户端挨饿。
我的想法是,在我们每次引用客户端列表之前,在从队列中获取消息之前,我们都会查看消息以查看哪个客户端提交了消息。如果它是针对我们刚刚处理的同一个客户端,我们将其推回,直到我们找到另一个客户端的消息,或者我们迭代所有客户端并且找不到其他工作。
这是一个合理的解决方案吗?这是一个已经解决的问题吗?如果解决了怎么办?
我已经看过这个问题 (Is "fair queuing" possible with JMS),但我认为群组不是正确的答案,因为我不希望所有消息都发送到单个服务器。我只是想给其他客户的消息一个公平的处理机会,而不是在一个客户的一千条其他消息后面排队。
目前我们使用 ActiveMQ 作为我们的消息队列系统。
【问题讨论】:
标签: activemq