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

如何创建使用不同传输的单个NServiceBus端点?,nservicebus,msmq,cqrs,event-sourcing,eventstoredb,Nservicebus,Msmq,Cqrs,Event Sourcing,Eventstoredb,背景 我们正试图在公司中引入一种新的体系结构模式,并正在考虑使用服务总线进行事件源的CQR。我们目前开发POC的技术有NServiceBus、事件存储和MSMQ。我们希望在NServiceBus中使用两种不同的传输定义一个端点,即命令的MSMQ和事件的事件存储。目前我们企业的现状不允许我们轻松地将所有内容切换到事件存储,因为我们在使用MSMQ的传统应用程序上有大量投资,这也是我们考虑采用混合方法的原因 问题: 是否可以创建一个使用不同传输的NServiceBus端点?如果是,如何进行?如果没有,

背景

我们正试图在公司中引入一种新的体系结构模式,并正在考虑使用服务总线进行事件源的CQR。我们目前开发POC的技术有NServiceBus、事件存储和MSMQ。我们希望在NServiceBus中使用两种不同的传输定义一个端点,即命令的MSMQ和事件的事件存储。目前我们企业的现状不允许我们轻松地将所有内容切换到事件存储,因为我们在使用MSMQ的传统应用程序上有大量投资,这也是我们考虑采用混合方法的原因

问题:

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

我认为最好的选择是使用MSMQ作为NServiceBus中的传输。下面是它的样子:

  • 通过MSMQ发送命令
  • 在命令处理程序(re)中,创建作为命令目标的聚合
  • 调用操作
  • 将生成的事件与命令的消息id一起存储在EventStore中,以确保幂等性。聚合本身将负责知道它已经处理的命令
  • 在一个单独的组件(事件处理器)中,使用EventStore持久订阅API钩住所有事件流。其中一些已处理事件应导致发送命令。这样的命令可以通过托管在此事件处理器内的NServiceBus send only端点发送
  • 在该事件处理器中,您还可以通过NServiceBus和MSMQ重新发布所有事件。此类活动不应由其他服务订阅(见下文关于自治的说明)
  • NServiceBus SAGA(流程管理器)应该位于您的服务边界内,并对这些事件处理器通过MSMQ发送或重新发布的命令和/或事件作出反应
关于服务边界的一点意见是,您必须决定适合您的服务自治级别: *弱,服务可以直接订阅其他服务事件流。在本设计中,显然允许跨服务边界的事件携带数据。
*Strong,其中服务使用更高级别的事件进行通信,这些事件只携带事物的标识,没有数据。如果您需要类似的内容,可以使用事件处理器将ES事件映射到这些“更高级别”的事件。

我们正在尝试在实现中使用NServiceBus Sagas。你会如何将传奇故事融入你的答案中?谢谢Szymon。我们的理想实现是让NServiceBus了解CQRS模式,并能够基于命令(MSMQ)和事件(事件存储)拆分传输。您可以使用事件处理器将事件存储映射到更高级别的事件,但这似乎不太符合我们的理想场景。我们还考虑将NCQRS作为NServiceBus的可能替代方案,但该项目似乎没有得到很好的维护。我们可能最终实现自己的功能。=)就信息功能而言,NCQRS不是NSB的替代品。它确实实现了ES聚合和命令处理,但将委托给底层基础结构以进行命令传递。此外,请在NSB github repo中针对多传输功能提出一个问题。这对决定未来的发展方向非常有帮助。