18

在我的工作中,很难在五分钟内没有人赞美 MQ 系列或 MSMQ 之类的优点,而且我总是想知道,在流行语的火花过去之后,这些出色设备的实际示例是什么?真实世界。

我正在寻找的东西可能会激发我找到其中一个的用途,或者给我一些我可以用来评估消息总线/消息代理/消息队列的指标——地狱,甚至可以解释的东西上述消息*事物之间有什么区别。

4

6 回答 6

17

MQ 系列或 MSMQ 等消息队列解决方案广泛用于集成分布式企业应用程序,尤其是在不同平台上运行的应用程序。做得对(使用持久队列、异步设计而不是“RPC over MQ”并关注操作需求),与同步请求/回复集成(例如 RPC 或样板 Web 服务(其可用性各自的可用性:同步集成 10 个具有 99% 可用性的系统,使您的组合可用性不超过 90%——如果只有一个薄弱环节,则更糟)。请注意,这要求消息队列本身具有高可用性:我们为此目的使用我们的大型机(猜猜我们正在使用哪种产品!)。

消息(或集成)代理和“总线”是更复杂的鱼。他们可以添加

  • 不同内容表示(文本编码和代码页)之间的转换
  • 监督,检测目标系统何时没有收到排队的消息并发出警报或自动重新启动
  • 转换,当系统不“说相同的语言”并以不同的方式表示客户或产品记录时:原则上这可以帮助您以不同的速率部署新版本
  • 路由(直到并包括发布/订阅)以将发送系统与接收者详细信息的知识分离,从而减少目标系统更改的影响
  • 编排,您可以在其中协调多个系统之间的消息以跟踪更长的实际业务流程(例如,从客户订单到交付到开票)。

我已经按照难度(和潜在奖励)大致递增的顺序列出了这些功能。您获得的越高,您的组织(包括业务方面)需要越成熟才能获得优势。

于 2009-04-08T15:09:10.007 回答
4

在不深入了解特定产品的细节的情况下,我可以为您提供使用典型消息队列系统的一些好处。

它们通常是模拟发布者/订阅者模式的良好基础设施。考虑一个大型事件系统,您不仅限于一个可执行文件,甚至一台机器。您将信息放入这些队列中,以便任何正在侦听它的应用程序都可以获取数据。

大多数消息队列系统允许持久队列。考虑一个典型的事件系统。如果侦听器在事件发生时断开连接或以其他方式无响应,则错过该事件。使用持久消息队列,消息将保留在队列中,直到重新连接侦听器。这种方式不会丢失任何数据/事件。

我不知道您列出的产品,但我知道使用 JMS,您可以在从队列中弹出消息时对线程进行细粒度控制。理论上,每个队列可以有一个线程,在该线程中执行操作,在消息被拉出时对消息执行操作。或者,您可以从多个队列中提取消息并对它们执行操作,所有这些都在一个共享线程中。

于 2009-04-08T14:56:30.347 回答
4

虽然我对 MQ 系列有过非常痛苦的体验,部分原因是它是由合作公司推给我们(微软商店)的,但使用 MQ 系列(或任何消息传递系统)是应用程序不可或缺的一部分.

本质上,我们正在构建一个流程来处理延期交货项目的供应链完成。如果我们的合作伙伴经销商没有客户想要的商品,他们会向 B2B 网站发送一条消息,该消息将针对可以完成订单的潜在公司。

我们构建了两种不同风格的集成。第一种是 ftp 方法,其中固定宽度的文件定期来回发送,我们添加了各种规则来帮助确保我们不会丢失任何数据。

第二个是使用 MQ 系列,其中消息被放入使用保证传递的队列中。然后我们会弹出队列并处理消息。排队系统在这里有很大的好处,因为它使我们能够以可靠的方式传输关键信息,从而使真钱得以转移。

另一方面,对于相同的 MQ 系列,我们必须实现同步查询来获取信息。我们希望它是同步的,因为我们的用户通过网络访问它会等待获取信息。在 MQ 系列上执行此操作是一个非常有趣且痛苦的挑战。在这里使用 MQ 的唯一原因是因为它是现有的通信线路并且查询功能已经存在。

第二个例子,这次是使用 MSMQ,它是一个从注入到客户端应用程序的 dialhome 代码中收集信息的站点。dialhome 代码将收集功能使用统计信息,例如 Microsoft 的 SQM 程序。当消息进入 Web 服务时,我们会将它们放在队列中,然后我们可以让任意数量的应用程序服务器弹出消息并将它们推送到数据库以滚动到仓库中。

这里的 MSMQ 确保我们可以通过快速将消息放入队列来处理突发消息。这有助于系统的可扩展性和可靠性。

于 2009-04-08T15:03:21.563 回答
4

消息队列对于实现负载平衡很有用。例如,服务器接收“工作”消息(订单、状态消息......)并将它们分发给所有正在侦听的客户端。

消息队列保证一条消息将被准确地传递给一个客户端。

如果客户端在不同的计算机上运行,​​则总负载将被分配,并且在必要时很容易将另一个客户端投入到消息负载中,客户端只需连接到队列并接收(部分)消息。

于 2009-04-08T15:25:33.710 回答
3

一个好的队列系统可以更容易地在多个线程、处理器、机器(甚至组织)上进行分布式计算。

不久前(10 年前),我使用了一个消息发送隐喻来为一个跨交易商经纪人实施一个前台期权定价系统。我们有用 C++、VB6 和 Excel/VBA 实现的服务(甚至使用 Excel 求解器!!),作为平面文件和 sql 的数据存储,用 Excel 和 VB6 编写的最终用户应用程序,具有复杂的数据模型(市场数据、产量曲线和体积曲面)。异步消息传递(具有持久/可靠消息和发布/订阅)使整个工作非常有效和可扩展 - 我们能够将东京和纽约办事处添加到伦敦基础设施,甚至无需访问远程站点 - 只是一个沼泽标准安装。

我是一个忠实的粉丝,尽管我很惊讶他们在过去 10 年左右的时间里没有走多远。

于 2009-12-02T11:52:39.153 回答
2

一个来自真实项目的非常“接近要求​​”的例子。从谁跑了好几年。在 ActiveMQ 上

1)航运市场的贸易中心。

  • 运输公司有系统知道他们可以实时运输多少包。

  • 每个系统都是不同的(例如:语言、设计等)

  • 我们为每个公司写了一个适配器“非常特殊的IT系统到ActiveMQ”

  • 每个适配器都有一个简单的工作要做:在公司有可用空间时发布,以及以什么价格发布。(“运输提议”)

  • 我们写了一个收集所有“运输建议”的客户,并很好地展示它们。

=> 达达。您有一个跨平台/语言/流程系统,适用于不想互相交谈的公司

=> Ta-da 2 : 如果一个新公司想进入你的贸易系统,他们只需要编写适配器。

于 2009-12-02T12:01:47.853 回答