关于消息总线/命令调度程序模式的混淆

时间:2011-11-18 15:05:23

标签: design-patterns event-handling distributed-system message-bus

最近我一直在阅读很多有关分布式消息传递和相关模式的内容。我使用了一些工具支持的例子,例如例如NServiceBus

其中许多模式都是在互联网上描述的。我最近读到的其中一些是:

如果使用像NService bus这样的工具来做很多工作而不考虑基础设施问题,那么当我尝试实现基本的消息总线和命令处理程序时,一些问题已经得到了解决。事实上,当谈到这些模式时,我看不出它们之间存在很多差异。

我不会粘贴代码,因为它很长但我发现了两篇博文,很好地描述了我想谈的实现方法。

这个想法很简单,消息总线跟踪订阅者并在他们感兴趣的情况下将消息发送给不同的订阅者。

它与消息总线非常相似。命令总线为给定的命令类型调用命令处理程序。

所以在这两种情况下都有相似之处。

使用一种模式比另一种模式有什么真正的差异和好处(我不是在谈论支持工具)。我缺少什么?

第二个问题是。 如果没有支持工具,消息总线是否有价值?我不认为自己会为自己的所有内容提供支持。

对于一个冗长且令人困惑的问题,我很抱歉,但请不要犹豫,询问更多细节。

2 个答案:

答案 0 :(得分:41)

哇,要比你所链接的MSDN提供更彻底或更可信的答案是很难的,所以让我们更简洁。

消息总线与通信有关。它甚至不要求传递通信是否是命令。它也不关心有效载荷是什么。它是“类型不可知的”。消息总线的主要关注点是跟踪谁应该获得每个通信(pub / sub)。这种模式的一个好处是,它将支持您尚未拥有规范的未来扩展。您可以在路上添加新的消息类型,此模型将很乐意提供它。消息总线更可能分布在应用程序之外,甚至可能在您的机器外部(例如,在10台服务器的集群之间分发)。

命令处理程序模型涉及将操作与命令的执行分开。传统上(至少在我使用的语言中)命令与UI控件及其事件和UI线程紧密相关。使用这个旧模型,在应用程序中定制或扩展可用命令的范围也很困难(比如使用扩展DLL)。命令处理程序模型将UI和命令执行的这些问题分开。您现在可以灵活地轻松添加更多命令处理程序并在没有UI事件的情况下执行命令(单元可测试)。这样可以实现更清晰,更模块化和可测试的代码。命令处理程序更有可能在内部成为应用程序的一部分。对命令集的任何扩展都可能会影响您的一个应用程序,而不是多个应用程序。

消息/命令代理关注连接不兼容或设计不同的独立系统。这是您希望一个应用程序与另一个应用程序交互并且没有一个或两个应用程序的源代码的用例。因此,您创建了一个代理,该代理从一方接收信息,并在另一方提供此信息,同时考虑到这两个应用程序进行通信所需的任何转换。 MSDN上的示例是一个电子商务网站,可能需要与支付处理器,运输公司和会计系统进行通信。您可能无法更改任何这些应用程序(包括电子商务系统)的源代码。也许电子商务系统需要IExamplePaymentGateway接口,而您的支付提供商需要IDifferentPaymentAPI接口。也许一个API用XML实现,另一个用JSON实现?无论存在何种差异,您的经纪人都有责任使连接成为可能。

正如您所看到的,它们都涉及以某种方式进行沟通。它们之间的界限可能很模糊,您甚至可以使用其中几种模式的组合来实现您的特定用例。

虽然我从未使用过NServiceBus,但这些类型的大多数库只是试图将抽象/学术模型包含在更具体的语言特定实现中。有时这可以节省您的时间,有时您会遇到来自未知开源贡献者的糟糕实现。您需要评估自己的用例以及首选开发语言中可用工具的适用性。

答案 1 :(得分:3)

通常,消息总线(或标准事件调度程序)可以为不同类型的消息/事件提供许多订阅者。

命令总线通常将命令分配给1个处理程序,类似于路由器解析到控制器的路由。