【发布时间】:2010-12-12 17:49:30
【问题描述】:
我有多个分布式竞争消费者,每个消费者都从同一个(事务性)队列中提取消息。我想将每个消费者实现为Idempotent Receiver,因此即使重复到达,我也不会多次处理同一消息(跨所有消费者)。如何在多个消费者中实现这一点?
我的第一个想法是在将它们放入队列之前以某种方式为每条消息生成一个连续的序列号,然后使用共享数据库表来协调消费者之间的工作。 IE。 consumer#1 处理 msg#1,然后将一行写入 DB 表,说明“msg#1 已处理”(希望它在数据库中以确保持久性)。当消费者准备好处理消息时,它会查看队列中的下一个可用消息,查阅共享数据库表并确定这是否是按顺序排列的下一个消息。如果是这样,它会将其从队列中拉出。如果不是,它会忽略它。
这样,我只需要存储最后处理的消息(因为所有消息都有一个连续的序列号),我不需要使用缓冲区来存储通过协商的“窗口”接收到的所有消息的 ID大小,并且消息总是被串行处理(这是我想要的这个场景)。
只是好奇是否有更好的方法?我担心每当我需要处理消息时查询数据库的成本。
如果答案是“它取决于框架”,那么我想到了 MSMQ
【问题讨论】:
标签: messaging idempotent