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

时间:2016-05-10 19:02:07

标签: nservicebus msmq cqrs event-sourcing get-event-store

背景

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

问题

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

1 个答案:

答案 0 :(得分:3)

亚伦

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

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

关于服务边界的一句话是,您必须决定适合您的服务级别:  *弱,服务可以直接订阅其他服务事件流。在此设计中,跨越服务边界的事件显然被允许携带数据。  *强大,服务使用更高级别的事件进行沟通,这些事件只带有事物的身份和无数据。如果您想要这样的东西,您可以使用事件处理器从ES事件映射到这些“更高级别”事件。