与卡夫卡一起实施传奇

时间:2017-05-08 10:21:27

标签: apache-kafka event-sourcing saga

我正在使用Kafka进行事件采购,我有兴趣使用Kafka实现传奇。我做了一些研究但是在这个主题上找不到任何东西。有关Sagas的大量信息,但我觉得使用Kafka的实现可能涉及到几个错综复杂的问题。有关如何做到这一点的最佳做法?提到的Commander模式here似乎接近我正在尝试构建的架构,但在演示文稿的任何地方都没有提到传奇。

2 个答案:

答案 0 :(得分:4)

今年DDD eXchange的演讲是我在事件驱动/ CQRS系统中遇到的最佳资源:流程管理器/ Saga模式: https://skillsmatter.com/skillscasts/9853-long-running-processes-in-ddd (需要注册免费帐户才能查看)

显示在那里的演示存在于github:https://github.com/flowing/flowing-retail

我给它一个旋转,我非常喜欢它。我建议先观看视频来设置舞台。

虽然显示的方法与消息总线无关,但演示使用Kafka为进程管理器发送命令并侦听来自其他有界上下文的事件。它不使用Kafka Streams,但我不明白为什么它不能插入Kafka Streams拓扑并成为更广泛的架构的一部分,就像你引用的Commander演示文稿中描述的那样。

我希望根据自己的需要对此进行进一步调查,所以请随时在Kafka用户邮件列表上开始一个帖子,这是一个合作这些模式的好地方。

希望有所帮助: - )

答案 1 :(得分:1)

我想在这里添加有关saga和Kafka的内容。

通常,Kafka与实际队列有点不同。基本上,一个很大的区别是不能保证消息的顺序(省去了某些例外,例如分区等)。

因此,如果您正在考虑根据诸如状态机之类的步骤设置一个传奇来控制某个过程,那么我建议您重新考虑您的设计,或者使用其他(实际)排队机制。

我举一个例子:


让我们考虑一下预订酒店房间的过程:

简化,它可能包含以下步骤:

  • 预订房间(即将到来的事件)
  • 已付费的房间(传入事件)
  • 发送预订确认书(已付款并进行了一些处理)

现在,如果您的传奇故事(请注意,这是一个简化的示例),如果尚未收到预订,则无法处理付款,那么您将依靠事件的顺序。


按照卡夫卡的说法,这注定会给您带来问题,因为不能保证顺序。

您可能会说:嗯,事件之间有足够的时间。不过,请考虑以下因素:

  • 如果您需要以某种方式将数据迁移到新系统,将会发生什么?
  • 您的传奇服务暂时中断后会发生什么?
  • 当您需要重播一堆消息时会发生什么?

如果顺序绑定到某个状态,则如果未按正确的顺序接收消息,则传奇将阻塞。这正是这些情况下可能发生的情况。


当然有解决这个问题的方法,并且并非在所有情况下都适用,但我认为在此指出是很好的。