5

背景

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

问题

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

4

1 回答 1

3

亚伦,

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

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

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

于 2016-05-11T17:09:21.160 回答