【发布时间】:2015-03-05 02:31:07
【问题描述】:
目标
我想实现事件的弹性处理,并且仍然按照它们到达的顺序处理它们。
说明
监听任务监听许多客户端的事件,将它们包装在消息中并将它们放入队列中。事件处理程序任务从队列中读取并处理事件。单个客户端的事件必须按顺序处理;不同客户端的事件可以乱序处理。一个简单的解决方案是:
在queue[client_id % N]创建N个队列,监听队列事件。每个队列都有一个从中读取的事件处理程序。
这可行,但我还必须考虑事件处理程序失败的情况。我可以想到两种方法来处理:
- 在队列的读者之间进行领导者选举 - 每个队列进行一次选举
- 使用 RabbitMQ 的确认功能(或其他 MQ 系统中的等效功能)- 每个队列都有多个事件处理程序。事件处理程序将消息出列并在完成处理后发回确认。
问题规模
大约有 5K 事件/秒,事件很小 50-200 字节。队列中的消息可能是由 1000 个事件组成的集群,以减少 MQ 开销。这意味着支持选项 2 并每秒处理数十条消息的 MQ 系统将可以工作。
问题
我可以执行选项 2 还是队列中的争用过多?它甚至支持使用确认吗?有没有更好的方法来实现这样的设计?我可以将事件集群发送到事件处理程序,并在发送下一个块之前等待 ACK,但我认为使用 MQ 可能不太需要重新发明轮子。
【问题讨论】:
-
我认为您需要一个特定于任务的单一队列。不知道你们的MQ系统是否支持这种东西。每个客户端使用一个队列的另一种选择,这取决于您的 MQ 系统、队列的成本,因此它可能也可以工作。如果我是你,我会写一个自动测试来测量。
-
你检查过 ZeroMQ 和 nanomsg 吗?它们也是很好的 MQ 系统,但工作方式与 RabbitMQ 不同。
-
@inf3rno,我没有使用 MQ 系统,但我正在考虑使用它。我会选择一个具有我需要的功能的系统。
标签: parallel-processing message-queue mq