messaging - 如何确保多个竞争消费者的消息幂等性?

标签 messaging idempotent

我有多个分布式竞争消费者,每个消费者都从同一个(事务性)队列中提取消息。我想将每个消费者实现为 Idempotent Receiver所以即使重复到达,我也不会多次处理相同的消息(跨所有消费者)。我怎样才能与多个消费者一起实现这一目标?

我的第一个想法是在将每个消息放入队列之前以某种方式为它们生成一个连续的序列号,然后使用共享数据库表来协调消费者之间的工作。 IE。消费者#1 处理 msg#1,然后将一行写入数据库表,说“msg#1 已处理”(希望它在数据库中以确保持久性)。当消费者准备好处理消息时,它会查看队列中的下一个可用消息,查询共享数据库表并确定这是否是按顺序的下一个消息。如果是这样,它会将其从队列中拉出。如果没有,它会忽略它。

这样,我只需要存储处理的最后一条消息(因为所有消息都有一个连续的序列号),我不需要使用一个缓冲区来存储通过协商的“窗口”大小接收的所有消息的 ID,并且消息总是串行处理(这是我想要的这种情况)。

只是好奇是否有更好的方法?我担心每当我需要处理消息时查询数据库的成本。

如果答案是“这取决于框架”,那么我就想到了 MSMQ

最佳答案

幂等接收器的要点是,如果一条消息被处理多次并不重要。因此,幂等接收者不需要以某种方式检测到消息是重复的,他们可以像往常一样简单地处理它......

所以要么你的接收器不是幂等的,要么你不必要地担心......

关于messaging - 如何确保多个竞争消费者的消息幂等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1668973/

相关文章:

apache-kafka - 具有 QoS/Kafka 分区过载的消息传递平台

windows - 没有代理的本地机器上的多对多消息传递

function - 幂等函数与纯函数相同吗?

mysql - 在 Memcached 中缓存 MySQL 查询结果并确保更新的一致性

java - Hibernate 幂等更新

html - 如果有小的副作用,可以使用 HTTP GET 吗?

.NET:向同一应用程序的所有实例发送文本消息并阅读

android - 在 flutter 中创建 Application.kt 的最佳方法是什么

java - 如果队列/数据库出现故障,何时关闭消息处理?

ajax - ajax请求是否需要重定向后获取?