【发布时间】:2019-10-25 19:43:06
【问题描述】:
实现outbox pattern 的常用方法是将消息负载存储在发件箱表中,并有一个单独的进程(消息中继)查询未决消息并将它们发布到消息代理,就我而言是卡夫卡。
发件箱表的状态可能如下所示。
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 状态。
第一个问题是:如果我启动多个消息中继实例,所有这些实例都会查询发件箱表,并且可能在某些时候不同的实例会获得相同的 PENDING 注册表以发布到 Kafka ,生成重复的消息。我怎样才能防止这种情况发生?
另一种情况:假设只有一个消息中继。它获取一条 PENDING 记录,将其发布到主题,但在将记录更新为 PROCESSED 之前崩溃。当它再次启动时,它会找到相同的 PENDING 记录并再次发布。有没有办法避免这种重复,或者唯一的方法是设计一个幂等系统。
【问题讨论】:
-
您将发件箱存储在哪种数据库上?
-
数据库是 MariaDB
-
为什么不使用Kafka-Connect来控制发送的事件? debezium.io/blog/2019/02/19/…
-
在类似的情况下调度程序应该运行多长时间,应该几乎是实时的?
标签: apache-kafka spring-cloud spring-cloud-stream