首页 > 解决方案 > 在事件驱动架构中,命令是否应该以与事件相同的方式发布到主题?

问题描述

通常,我们将“发生的事情”作为事件发布到 Kafka 主题,当我们想要执行命令时,我们调用 API。

向主题发布命令(例如创建发票)是否有任何问题......并让发票服务订阅该主题并在命令被消费时对其采取行动?

或者更一般地说……可以使用 Kafka 主题来发出异步命令,还是应该只用于发布“发生的事情”类型的事件?

标签: eventsmicroservicesevent-driven

解决方案


一年后,我在这里分享我的想法:)。

发出命令是“已经发生的事情”。然后一个命令可以改变系统的状态并产生事件。它也可能失败,因此您将为失败生成一个事件。

命令的公共主题将完全充当 Rest 端点。不同之处在于它是异步执行的。这意味着您需要通过命令 id 侦听与命令相关的已发生事件,以找出结果。您还需要考虑到,如果服务没有响应,该命令可能会在稍后执行。您获得的好处是异步执行,您不需要断路器等。

不确定您的问题中包含什么生成发票,但如果它只是生成一个 pdf 并可能通过电子邮件发送,它似乎是发送关于某个主题的命令并让它尽可能执行的最佳方法。

这里要记住一些事情。您应该在一个分区中发布与同一实体相关的命令消息,因为排序通常很重要。消息生产者需要牢记主题分区方案。如果您有多个生产者,则最好使用 Rest 端点将消息发布到正确的分区中。一个糟糕的选择是,如果您将此端点捆绑在消费者服务中,那么您将失去异步行为。

根据用例的不同,可能还有更多问题需要解决,但总的来说,我会在开始时做一些更简单的事情来满足要求。您可以稍后对其进行重构,而无需实际中断服务的客户端。


推荐阅读