【问题标题】:How to create a single NServiceBus endpoint that uses different transports?如何创建使用不同传输的单个 NServiceBus 端点?
【发布时间】:2016-09-05 22:10:24
【问题描述】:

背景

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

问题

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

【问题讨论】:

    标签: nservicebus msmq cqrs event-sourcing eventstoredb


    【解决方案1】:

    亚伦,

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

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

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

    【讨论】:

    • 我们正在尝试在我们的实现中使用 NServiceBus Sagas。您将如何将 Sagas 纳入您的答案中?
    • 谢谢希蒙。我们理想的实现是让 NServiceBus 了解 CQRS 模式并能够基于命令 (MSMQ) 和事件 (Event Store) 拆分传输。您使用事件处理器从事件存储映射到更高级别事件的想法是可能的,但似乎不太适合我们的理想场景。我们还考虑将 NCQRS 作为 NServiceBus 的可能替代方案,但该项目看起来维护得并不好。我们最终可能会实现我们自己的。 =)
    • NCQRS 在消息传递功能方面不是 NSB 的替代品。它确实实现了 ES 聚合和命令处理,但委托给底层基础设施进行命令传递。
    • 另外,请在 NSB github repo github.com/Particular/NServiceBus 中针对多传输功能提出问题。这对于决定未来的发展方向非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多