有人可以解释一下消息代理的用途吗?
Posted
技术标签:
【中文标题】有人可以解释一下消息代理的用途吗?【英文标题】:Can someone explain what message brokers are used for? 【发布时间】:2010-10-18 08:07:44 【问题描述】:在我的工作中,很难在五分钟内没有人赞美 MQ 系列或 MSMQ 之类的优点,我总是想知道,在流行语的火花过去之后,有哪些实际的 示例 这些奇妙的设备出现在现实世界中。
我正在寻找的东西可能会激发我找到其中一个的用途,或者给我一些我可以用来评估消息总线/消息代理/消息队列的指标——天哪,甚至是什么这将解释上述 message* 事物之间的区别。
【问题讨论】:
根据我最近在另一家公司的经验,它们的存在是为了打破常规,让更多的人跟踪问题。我也希望,当正确使用它们时,它们对某些事情有用。 不是 AWS 的粉丝,但它们提供了使用消息队列的出色而简洁的理由 aws.amazon.com/message-queue/benefits 【参考方案1】:在不涉及特定产品的细节的情况下,我可以告诉您使用典型消息队列系统的一些好处。
它们通常是模拟发布者/订阅者模式的良好基础设施。考虑一个大型事件系统,您不仅限于一个可执行文件,甚至一台机器。您将信息放入这些队列中,以便任何正在侦听它的应用程序都可以获取数据。
大多数消息队列系统都允许持久队列。考虑一个典型的事件系统。如果侦听器在事件发生时断开连接或以其他方式无响应,则错过该事件。使用持久消息队列,消息将保留在队列中,直到重新连接侦听器。这种方式不会丢失任何数据/事件。
我不知道您列出的产品,但我知道使用 JMS,您可以在从队列中弹出消息时对线程进行细粒度控制。理论上,每个队列可以有一个线程,在该线程中执行操作,在消息被拉出时对消息执行操作。或者,您可以从多个队列中提取消息并对它们执行操作,所有这些都在一个共享线程中。
【讨论】:
【参考方案2】:虽然我对 MQ 系列有过非常痛苦的体验,部分原因是它是由合作公司推给我们(微软商店)的,但使用 MQ 系列(或任何消息传递系统)是不可或缺的一部分到应用程序。
基本上,我们正在构建一个流程来处理缺货商品的供应链完成情况。如果我们的合作伙伴经销商没有客户想要的商品,他们会将消息发送到 B2B 网站,该网站将针对可以完成订单的潜在公司。
我们构建了两种不同风格的集成。第一种是 ftp 方法,其中固定宽度的文件定期来回发送,我们添加了各种规则来帮助确保不会丢失任何数据。
第二个是使用 MQ 系列,其中消息通过有保证的传递放置到队列中。然后我们将弹出队列并处理消息。排队系统在这里有很大的好处,因为它使我们能够以可靠的方式传输关键信息,从而实现真钱的转移。
另一方面,对于相同的 MQ 系列,我们必须实现同步查询来获取信息。我们希望它是同步的,因为我们的用户通过网络访问它会等待获取信息。在 MQ 系列上执行此操作是一个非常有趣且痛苦的挑战。在这里使用 MQ 的唯一原因是因为它是现有的通信线路并且查询功能已经存在。
第二个例子,这次是使用 MSMQ,它是一个从注入到客户端应用程序的 dialhome 代码中收集信息的站点。 dialhome 代码将收集功能使用统计信息,如 Microsoft 的 SQM 程序。当消息进入 Web 服务时,我们会将它们放入队列中,然后我们可以让任意数量的应用程序服务器弹出消息并将它们推送到数据库以滚动到仓库中。
这里的 MSMQ 确保我们可以通过快速将消息放入队列来处理突发消息。这有助于系统的可扩展性和可靠性。
【讨论】:
【参考方案3】:MQ 系列或 MSMQ 等消息队列解决方案广泛用于集成分布式企业应用程序,尤其是在不同平台上运行的应用程序。做得对(使用持久队列、异步设计而不是“RPC over MQ”并关注操作要求),与 RPC 或样板 Web 服务等同步请求/回复集成(其可用性是各自可用性的乘积:同步集成 10 个具有 99% 可用性的系统,使您的组合可用性不超过 90%——如果只有一个薄弱环节,则更糟)。请注意,这要求消息队列本身具有高可用性:我们为此目的使用大型机(猜猜我们正在使用哪种产品!)。
消息(或集成)代理和“总线”是更复杂的鱼。他们可以添加
不同内容表示(文本编码和代码页)之间的翻译 监督,检测目标系统何时没有接收到排队的消息并发出警报或自动重启 转换,当系统不“说同一种语言”并代表例如不同的客户或产品记录:原则上这可以帮助您以不同的速度部署新版本 路由(直至并包括发布/订阅)以将发送系统与接收者详细信息的知识分离,从而减少目标系统更改的影响 编排,您可以在其中协调多个系统之间的消息,以跟踪更长的实际业务流程(例如,从客户订单到交付到开票)。我已按难度(和潜在奖励)大致递增的顺序列出了这些功能。您获得的越高,您的组织(包括业务方面)需要越成熟才能获得优势。
【讨论】:
【参考方案4】:消息队列对于实现负载平衡很有用。例如,服务器接收“工作”消息(订单、状态消息......)并将它们分发给所有正在监听的客户端。
消息队列保证一条消息将被准确地传递给一个客户端。
如果客户端在不同的计算机上运行,总负载将被分配,并且在必要时很容易将另一个客户端扔到消息负载中,客户端只需连接到队列并接收(部分)消息。
【讨论】:
【参考方案5】:一个好的队列系统可以更容易地在多个线程、处理器、机器(甚至组织)上进行分布式计算。
不久前(10 年前),我使用了一个消息发送隐喻来为一个交易商间经纪人实施一个前台期权定价系统。我们有用 C++、VB6 和 Excel/VBA 实现的服务(甚至使用 Excel 求解器!!),作为平面文件和 sql 的数据存储,用 Excel 和 VB6 编写的最终用户应用程序,具有复杂的数据模型(市场数据、产量曲线和体积曲面)。异步消息传递(具有持久/可靠消息和 pub/sub)使整个工作非常有效和可扩展 - 我们能够将东京和纽约办事处添加到伦敦基础设施,甚至无需访问远程站点 - 只是一个沼泽标准安装。
我是一个忠实的粉丝,尽管我很惊讶他们在过去 10 年左右的时间里没有走多远。
【讨论】:
【参考方案6】:真实项目中的一个非常“接近要求”的示例。从谁跑了好几年。在 ActiveMQ 上
1) 航运市场的贸易中心。
运输公司的系统知道他们可以实时运输多少数据包。
每个系统都不同(例如:语言、设计等)
我们为每家公司写了一个适配器“非常特殊的IT系统到ActiveMQ”
每个适配器都有一个简单的工作要做:在公司有可用空间时发布,以及以什么价格发布。 (“交通建议”)
我们编写了一个客户端,它收集所有“运输建议”,并很好地展示它们。
=> 达达。您有一个跨平台/语言/流程系统,适用于不想互相交谈的公司
=> Ta-da 2 : 如果一个新公司想进入你的交易系统,他们只需要编写适配器。
【讨论】:
以上是关于有人可以解释一下消息代理的用途吗?的主要内容,如果未能解决你的问题,请参考以下文章