gpt4 book ai didi

apache-kafka - 发件箱模式 - 我们如何防止消息中继过程生成重复的消息?

转载 作者:行者123 更新时间:2023-12-04 02:30:36 25 4
gpt4 key购买 nike

实现 outbox pattern 的常用方法是将消息有效负载存储在发件箱表中,并有一个单独的进程( 消息中继 )查询待处理的消息并将它们发布到消息代理中,在我的例子中是 Kafka。

发件箱表的状态可能如下所示。

 OUTBOX TABLE
---------------------------------
|ID | STATE | TOPIC | PAYLOAD |
---------------------------------
| 1 | PROCESSED | user |
| 2 | PENDING | user |
| 3 | PENDING | billing |
----------------------------------

My Message Relay 是一个 Spring Boot/Cloud Stream 应用程序,它会定期 ( @Scheduled ) 查找 PENDING 记录,将它们发布到 Kafka 并将记录更新为 PROCESSED 状态。

第一个问题是 :如果我启动 Message Relay 的多个实例,所有实例都会查询 Outbox 表,并且可能在某些时候不同的实例将获得相同的 PENDING 注册表以发布到 Kafka,从而生成重复的消息。我怎样才能防止这种情况?

另一种情况 : 假设只有一个消息中继。它获取一个 PENDING 记录,将其发布到主题,但在将记录更新为 PROCESSED 之前崩溃。当它再次启动时,它会找到相同的 PENDING 记录并再次发布它。有没有办法避免这种重复,或者唯一的方法是设计一个幂等系统。

最佳答案

为了防止第一个问题,您必须使用数据库锁定。

SELECT * FROM outbox WHERE id = 1 FOR UPDATE

这将阻止其他进程访问同一行。

您无法解决的第二个问题是因为您没有与 Kafka 进行分布式事务。

因此,一种方法可能是在将记录发送到 Kafka 之前将记录设置为 PROCESSING 之类的状态,如果应用程序崩溃,您应该检查是否有处于 PROCESSING 状态的记录并执行一些清理任务以了解它们是否已经发送到 Kafka .

但最好的解决方案是拥有一个可以处理重复项的幂等系统。

关于apache-kafka - 发件箱模式 - 我们如何防止消息中继过程生成重复的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56542780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com