如何创建使用不同传输的单个 NServiceBus 端点?

How to create a single NServiceBus endpoint that uses different transports?

背景

我们正在尝试在公司中引入一种新的架构模式,并且正在考虑使用服务总线将 CQRS 与事件溯源结合起来。我们目前正在开发 POC 的技术有 NServiceBus、Event Store 和 MSMQ。我们希望在 NServiceBus 中有一个单一端点定义了两种不同的传输方式,MSMQ 用于我们的命令,Event Store 用于我们的事件。我们企业的当前状态不允许我们目前轻松地将所有内容切换到 Event Store,因为我们对使用 MSMQ 的遗留应用程序进行了大量投资,这就是我们考虑混合方法的原因。

问题

是否可以创建使用不同传输的单个 NServiceBus 端点?如果是,如何?如果没有,有什么替代方案?

亚伦,

我认为最好的选择是使用 MSMQ 作为 NServiceBus 中的传输。它可能是这样的:

  • 通过 MSMQ 发送命令
  • 在命令处理程序中(重新)创建作为命令目标的聚合
  • 调用操作
  • 将生成的事件与命令的消息 ID 一起存储在 EventStore 中,以确保幂等性。聚合本身将负责了解它已经处理的命令
  • 在单独的组件(事件处理器)中使用 EventStore 持久订阅 API 挂钩到所有事件 流。其中一些已处理的事件应该导致发送命令。此类命令可能会通过托管在此 事件处理器 .
  • 内的 NServiceBus 仅发送端点发送
  • 事件处理器中,您还可以通过 NServiceBus 和 MSMQ 重新发布所有事件。此类事件不应由其他服务订阅(请参阅下面关于自治的注释)
  • NServiceBus Sagas(流程管理器)应该存在于您的服务边界内,并对这些 事件处理器 通过 MSMQ 发送或重新发布的命令 and/or 事件作出反应。

关于服务边界的一个评论是,您必须决定适合您的服务自治级别: * 弱,服务可以直接订阅其他服务事件流。在这种设计中,跨服务边界的事件显然是允许携带数据的。 * 强,服务使用更高级别的事件进行通信,这些事件仅携带事物的身份,无数据。如果您想要这样的东西,您可以使用 事件处理器 将 ES 事件映射到这些 "higher level" 事件。