通常我们会发布"已经发生的事情"。作为Kafka主题的事件,当我们想要执行命令时,我们调用API。
发布命令(例如创建发票)到主题有什么问题吗…让结账服务订阅该主题并在使用命令时对其进行操作?
或者更一般地…是否可以使用Kafka主题来发出异步命令,或者它应该只用于发布"发生的事情"?类型的事件?
一年过去了,我在这里分享我的想法:)。
发出命令是"已经发生的事情"。然后,命令可以改变系统的状态,并生成事件。它也可能失败,因此您将为失败生成一个事件。
命令的公共主题将完全充当Rest端点。不同之处在于它是异步执行的。这意味着您需要通过命令id侦听与该命令相关的已发生的事件,以确定结果。您还需要考虑到,如果服务没有响应,该命令可能会在相当晚的时候执行。你得到的好处是异步执行,你不需要断路器之类的。不确定您的问题中包含什么生成发票,但如果它只是生成pdf并可能通过电子邮件发送它,似乎这是就主题发送命令并让它随时执行的最佳方法。
这里有一些要记住的事情。您应该在一个分区中发布与同一实体相关的命令消息,因为排序通常很重要。消息生产者需要记住主题分区方案。如果有多个生产者,最好使用Rest端点在正确的分区中发布消息。如果您将此端点绑定到消费者服务中,那么您将失去异步行为,这是一个糟糕的选择。
可能有更多的问题需要解决,这取决于用例,但一般来说,我会在开始时做更简单的事情来满足需求。您可以稍后重构它,而不必实际中断客户端对服务的访问。