eme*_*hie 11 messaging idempotent
我有多个分布式竞争消费者,每个消费者都从同一个(事务性)队列中提取消息。我想将每个消费者实现为幂等接收器,因此即使重复到达,我也不会多次处理相同的消息(跨所有消费者)。我怎样才能与多个消费者一起实现这一目标?
我的第一个想法是在将每个消息放入队列之前以某种方式为它们生成一个连续的序列号,然后使用共享数据库表来协调消费者之间的工作。即消费者#1 处理msg#1,然后将一行写入数据库表,说“msg#1 已处理”(希望它在数据库中以确保持久性)。当消费者准备好处理消息时,它会查看队列中的下一个可用消息,查询共享数据库表并确定这是否是按顺序的下一个消息。如果是这样,它会将其从队列中拉出。如果没有,它会忽略它。
这样,我只需要存储处理的最后一条消息(因为所有消息都有一个连续的序列号),我不需要使用一个缓冲区来存储通过协商的“窗口”大小接收的所有消息的 ID,并且消息总是串行处理(这是我想要的这种情况)。
只是好奇是否有更好的方法?我担心每当我需要处理消息时查询数据库的成本。
如果答案是“这取决于框架”,那么我就想到了 MSMQ
我通过确保每条消息都有一个 GUID 或其他唯一标识符,然后将它记录在与更改持久性存储中的状态相同的事务中,从而完成了幂等消息。
对于每条消息,您现在可以检查持久性存储中是否存在唯一 id。
如果唯一 id 存在,您就知道它之前已处理过,并且状态更改保留在同一事务中。
如果唯一 id 不存在,您就知道它从未被处理过。
如果两个消费者处理相同的消息,因为您存储处理过的唯一 ID 的表具有唯一约束,当两个消费者都提交事务时,其中一个必须失败并回滚所有更改,而另一个将成功。
幂等接收者的要点是,如果消息被处理多次并不重要。因此,幂等接收者不需要以某种方式检测消息是否重复,他们可以像往常一样简单地处理它......
所以要么你的接收者不是幂等的,要么你是不必要地担心......
| 归档时间: |
|
| 查看次数: |
6444 次 |
| 最近记录: |