需要帮助 我正在使用 CQRS 实现我想知道在消息传递方面我应该选择哪种方法保证哪种方法适合 CQRS
如果我至少选择一个,我将有重复的并且
如果我最多选择一个,我最终可能会得到两个不同步的表。
但是,如果只选择一次,我读到它会增加 50% 的延迟 我想知道我应该做出什么权衡 在选择 CQRS 架构时
tl;dr 您需要至少一次语义并确保可以处理重复项。
所以“最多一次”无论如何都是不可能的,因为你可能会丢失消息。
“恰好一次”可能听起来很诱人,说实话,我不能 100% 确定它在 Kafka 中是如何工作的,但从您链接的页面中您可以看到它在 Kafka 生态系统(Kafka Streams、连接)。我认为可以公平地说,在某些情况下,Kafka 保证恰好一次交付。您应该更关心的是您的消费者应用程序中的恰好一次处理。 即使消息只传递一次,想象一下您的消费者读取它并更新读取端,但在提交 Kafka 偏移量之前,您的消费应用程序崩溃了。然后,一旦进程重新启动,您仍然会再次阅读该消息。也就是说,即使“仅一次”传递,您也需要能够处理重复项。 Kafka 的“恰好一次”并没有将 Kafka 变成一个参与分布式两阶段提交事务的事务系统(无论如何,并不是任何人都想要这样)。
如何处理重复项 - 这很大程度上取决于您的消息。也许它们无论如何都是幂等的,也许您需要构建一些重复数据删除功能。
但是如果你
可以处理重复项 - 那么“至少一次”就可以了。就是这样,“至少一次”加上处理重复的能力对你来说效果很好(从我见过的项目来看,这实际上是人们通常这样做的方式)。