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

Aar*_*mer 5 msmq nservicebus cqrs event-sourcing get-event-store

背景

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

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

Szy*_*ega 3

亚伦,

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

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

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