events - 在事件驱动架构中,命令是否应该以与事件相同的方式发布到主题?

标签 events microservices event-driven

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

向某个主题发布命令(例如创建发票)并让发票服务订阅该主题并在使用命令时对其执行操作是否有任何问题?

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

最佳答案

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

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

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

不确定生成发票包含在您的问题中,但如果它只是生成 pdf 并可能通过电子邮件发送,那么似乎这是发送有关主题的命令并让它在可能的情况下执行的最佳方法。

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

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

关于events - 在事件驱动架构中,命令是否应该以与事件相同的方式发布到主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66343009/

相关文章:

javascript - 文本选择和冒泡

javascript - 非 DOM 对象上的 jQuery 自定义事件

ruby - 事件/观察者驱动的 Ruby on Rails

javascript - VueJS 2 : Catch event of direct child component

javascript - 在 Google Maps API v3 中修改多边形后的事件

C# 事件传递/冒泡

java - 如何在其他模块中使用 gradle 子模块作为库?

microservices - falcor 在微服务架构中的作用是什么?

用于多环境本地开发的 Docker

linux - 事件驱动和异步有什么区别?在 epoll 和 AIO 之间?