在消息代理(ServiceBus)中将命令与事件混合

Mix Commands with Events in message broker(ServiceBus)

我有 OrderOrderProcessor 服务。 订单提交后,必须由 OrderProcessor 处理。处理后,OrderProcessor 应将响应发送到带有订单状态的订单服务,例如Failed/Succeeded。我想使用消息代理 (Azure ServiceBus) 进行异步处理并解耦我的服务。

在命令和事件方面,我看到以下结构:

有几种方法可以使用队列或主题在 ServiceBus 中实现它。 我想使用一个共享主题,其中将发布 ProcessOrder 消息和 OrderProcessedFailed/OrderProcessedSucceeded 事件.每个服务都有自己的订阅,并按事件类型过滤。

我知道当您采用事件驱动方法时,共享主题结构对于简单场景是一个不错的选择。但就我而言,我还有 ProcessOrder 命令。我期待订单将被处理。当我只是提出 OrderCreated 事件(或其他)并期待对它的任何反应时,情况就不一样了。

将命令和事件混合在一个共享主题中或完全混合命令和事件实际上是一种好方法吗? 将消息驱动的方法与请求和回复队列一起使用会更好吗?并将响应事件替换为 OrderReply 消息(其中包含 Failed/Succeeded 状态)?

附加信息:

我不确定将来会不会有任何其他命令 or/and 事件。但如果是这样的话,最好有易于维护的结构,例如所有服务的共享主题。

我现在所知道的应该支持不同版本的 OrderProcessors。而且我相信使用主题和带有过滤器的订阅者来处理命令消息版本会更容易。而不仅仅是在应用程序级别过滤消息。

这方面不一定有硬性规定,但我个人会采用的方法是一种用于命令,一种用于事件——也就是主题和目的之间的 1-1 映射。如果您需要在构建服务时扩展主题的能力,那么将主题与单个订阅者一起使用没有错。

添加不同的 OrderProcessor 可能会很好地利用过滤器,无论是在服务中还是在您的代码中。他们每个人都可以有自己的命令主题订阅,这样订购服务就不需要知道给定命令最终将使用哪个处理器。

接下来要考虑的是向组合中添加一种完全不同类型的服务——比如从 OrderProcessor 接收命令的服务。如果您最终希望服务的数量随着复杂的连接而增长得非常大,那么拥有该中央命令主题可能是一个不错的选择 - 它允许来自任何组件的命令移动到任何其他组件。

另一方面,如果您的服务类型仍然偏低,那么将目的定义得更窄可能是有意义的——比如将 orderCommands 和 inventoryCommands 分开。如果您更喜欢这种设计,那么在那种情况下使用单个命令主题也不会错。

您也可以使用自动转发将两者结合起来。您的中央命令主题接收所有消息,然后将它们自动转发到 orderCommands 和 inventoryCommands 主题。在大型系统中,这会使您为单个主题管理的订阅数量减少一点。