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