有人能解释一下消息代理的用途吗?

20

在我的工作中,几乎每五分钟就会有人赞扬MQ Series、MSMQ或类似产品的优点,当这些炫酷的术语消失后,我总是想知道这些神奇的设备在现实世界中的一些实际应用 例子

我希望找到一些能够激发我使用其中之一的用途,或者给我某种度量标准,以便评估消息总线/消息代理/消息队列,甚至能解释上述消息* 事物之间的区别的东西。


2
在我最近与另一家公司的经验中,他们的存在是为了破坏事物并让更多的人跟踪问题而就业。我也希望当它们被正确利用时,它们能够对某些事情有所帮助。 - JeeBee
对于AWS并不是很感冒,但他们提供了使用消息队列的令人惊讶的好处,而且解释简洁明了。https://aws.amazon.com/message-queue/benefits/ - Grzegorz Luczywo
6个回答

17
像MQ Series或MSMQ这样的消息队列解决方案被广泛用于集成分布式企业应用程序,特别是在不同平台上运行时。如果处理正确(采用持久队列、异步设计而不是“RPC over MQ”以及关注操作要求),与同步请求/响应集成(例如RPC或模板化Web服务)相比,这将为您提供高可用性(其可用性是各自可用性的乘积:同步地将十个具有99%可用性的系统集成在一起最多只能给您带来不超过90%的总可用性——如果只有一个薄弱环节则更糟)。请注意,这要求消息队列本身具有高可用性:我们使用我们的大型机实现这一目的(猜猜我们使用的是哪种产品!)。
消息(或集成)代理和“总线”是一种更复杂的问题。它们可能会增加:
- 在不同内容表示(文本编码和代码页)之间的转换 - 监管,检测目标系统未接收排队消息并引发警报或自动重新启动 - 当系统不“说同一种语言”并以不同方式表示客户或产品记录时的转换:原则上,这可以帮助您以不同速率部署新版本 - 路由(包括发布/订阅)以将发送系统与接收者的详细信息分离,从而减少目标系统更改的影响 - 编排,其中您可以协调一些系统之间的消息以跟踪更长的实际业务过程(例如,从客户订单到交付再到发票)。
我大致按照难度(和潜在奖励)递增的顺序列出了这些功能。您越高效,组织(包括业务方面)就需要越成熟才能获得优势。

4

不涉及特定产品,我可以告诉您使用典型消息队列系统的一些好处。

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

大多数消息队列系统允许持久化队列。想象一个典型的事件系统。如果在事件发生时,听众断开连接或无响应,则会错过该事件。通过持久消息队列,消息将保留在队列中,直到听众重新连接为止。这样就不会丢失任何数据/事件。

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


4
尽管我有着非常糟糕的MQ Series使用经历,部分原因是因为合作公司强制要求我们(一个微软商店)使用它,但使用MQ Series(或任何消息传递系统)是应用程序中不可或缺的一部分。
本质上,我们正在构建一个处理供应链履行后订单商品的流程。如果我们的合作伙伴-分销商没有他们客户想要的商品,他们会向B2B网站发送一条消息,该网站将针对可能能够满足订单的公司。
我们已经构建了两种不同口味的集成。第一种是使用ftp方法,定期发送固定宽度文件,我们添加了各种规则来帮助确保不会丢失任何数据。
第二种是使用MQ Series,其中使用guarenteed delivery方法将消息放入队列中。然后,我们将弹出队列并处理消息。在这里,排队系统非常有益,因为它允许我们以可靠的方式传输导致真正资金变动的关键消息。
另一方面,在同样使用MQ Series的情况下,我们必须实现同步查询以获取信息。我们希望它是同步的,因为我们通过Web访问此信息的用户会等待获取信息。通过MQ Series完成此操作是一个非常有趣和痛苦的挑战。在这里使用MQ的唯一原因是它是现有的通信线路,查询功能已经存在。
第二个例子,这次使用MSMQ,是一个从客户端应用程序注入的dialhome代码收集信息的站点。 dialhome代码将收集功能使用统计数据,如Microsoft的SQM程序。当消息进入Web服务时,我们会将其放在队列中,然后我们可以有任意数量的应用服务器弹出消息并将其推送到数据库中以滚动到仓库中。
MSMQ确保我们可以通过快速将它们放置在队列中来处理消息爆发。这有助于系统的可扩展性和可靠性。

4
一个消息队列在实现负载均衡时非常有用。例如,服务器接收“任务”消息(订单、状态消息等),并将其分发给所有正在监听的客户端。
消息队列保证一条消息将会被传递到恰好一个客户端。
如果客户端运行在不同的计算机上,总负载将会得到分配,并且当需要时很容易向消息负载中添加另一个客户端,该客户端只需连接到队列,就可以接收(部分)消息。

4
一个好的排队系统可以使得在多个线程、处理器、机器(甚至组织)上进行分布式计算变得更加容易。10年前,我使用了消息发送的比喻来实现一个面向经销商的期权定价系统。我们使用C++、VB6和Excel/VBA实现了服务,使用平面文件和SQL进行数据存储,使用Excel和VB6编写了复杂的数据模型(市场数据、收益曲线和波动率曲面)。异步消息传递(带有持久/可靠消息和发布/订阅功能)使整个系统运作得非常有效和可扩展 - 我们能够将东京和纽约办事处添加到伦敦基础设施中,而无需访问远程站点,只需要进行标准安装。虽然我是一个忠实的粉丝,但我很惊讶它们在过去的10年中没有走得更远。

2

以下是一项来自真实项目的非常“贴近需求”的例子,该项目已经运行了多年,并且使用ActiveMQ。

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

  • 船运公司拥有一个系统,可以实时知道他们可以运输多少货物。

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

  • 我们为每家公司编写了一个适配器,将其“非常特殊的 IT 系统”转换为 ActiveMQ。

  • 每个适配器的工作很简单:在公司有空闲空间和价格时发布“运输建议”。

  • 我们编写了一个客户端,收集所有“运输建议”并将它们漂亮地显示出来。

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

=> 哒哒声2:如果新公司想要加入您的贸易系统,他们只需要编写适配器即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接