消息导向中间件(如AMQP)在哪些领域有用?

57

MOM(消息导向中间件)解决了什么问题?扩展性?集成?

它们通常用于哪些领域,哪些领域通常使用它们?

例如,Google是否在其主要搜索引擎或为Gmail提供动力时使用这种解决方案?

像沃尔玛、eBay、联邦快递(基本上是Java商店)和buy.com(基本上是MS商店)这样的大型网站是否需要MOM来解决问题?

当编写Web应用程序并控制服务器端并具有同质环境(例如数十个运行Linux + Java JVMs的Amazon EC2实例)时,在此种情况下,客户端是Web浏览器,这是否有意义?

桌面应用程序需要与服务器通信时是否有意义?

还是“仅”针对大型企业,其中通常有无数不同的系统需要以某种方式进行通信?

我有点困惑它们有什么用处,我认为如果有适当的示例,我就可以更好地理解它们的用途。


3
这里有太多问题了...根据 Stack Overflow 的规定,每个帖子只能有一个问题...从这些问题中我推断出你并没有充分地进行研究...顺便说一句,我认为你应该编辑你的问题以缩小范围! - t0mm13b
18
“我从众多提问中了解到,你没有充分地研究这个问题…” 这句话明显是冒犯的。而且这样的回答基本上适用于 SO 上的每一个问题。在 SO 上,“GIYF”类型的回答是不受欢迎的。 - cocotwo
是的,这听起来可能有些严厉和残酷,但是在标题下提出太多问题就太多了...如果这冒犯了您,我很抱歉...您没有说明您在寻找什么、如何、在哪里、为什么?我们没有得到报酬来做这件事...但无论如何,我已经回答了您的问题... - t0mm13b
12
好问题;你的子问题实际上是阐明你的主要问题的例子。 - Henrik
我理解你的问题,但为了准确起见,AMQP本身不是中间件,它是一种消息传输标准。 - Duncan
一个非常好而且与主题相关的问题! - Ashkan Kh. Nazary
4个回答

33

这是一个很好的问题。

消息传递的主要用途包括:扩展、卸载工作、集成、监控、事件处理、路由、网络、推送、移动性、缓冲、排队、任务共享、警报、管理、日志记录、批量处理、数据传递、发布/订阅、多播、审计、调度...等等。基本上,对于任何需要数据但不想发出数据库请求的情况都可以使用消息传递。(缓存是另外一个更长的故事)

从另一个角度来看,许多应用程序过去是通过假设用户(人)执行的操作将通过在数据库上执行事务(包括读取、写入)来实现的。但今天,许多操作不是由用户发起的,而是由应用程序发起的。例如,“告诉我我想买的书何时有库存”。解决这类问题的最佳方式是使用某种形式的消息传递。无论您将其称为中间件、Web 推送还是实时沙拉酱,都无关紧要。这都是消息传递。

当您使应用程序能够启动或响应事件时,那么基于松耦合组件的架构就会变得更容易扩展。如果您的消息传递基于稳定、可扩展、可服务的工具,并且最好使用开放标准的 API 和协议,那么将这些组件集成起来也会更容易。

希望这有所帮助。我们试图维护有关消息传递的有用链接列表此处

如有疑问和评论,请与我们联系,我们很容易找到。


1
一直是实时沙拉酱(RTSD)的忠实粉丝 :) - Samih3

14

回答您的具体问题:

它们通常在哪些领域中使用,哪些领域通常不使用?

和数据库一样,消息系统在各个领域都有应用。

例如,谷歌是否在其主要搜索引擎或Gmail上使用此类解决方案?

谷歌使用很多自家开发的技术,但是他们的开源贡献和公开的使用案例表明,消息传递对于一些主要服务来说非常重要(或者应该是重要的)。

那像沃尔玛、eBay、联邦快递(几乎是Java商店)和buy.com(几乎是MS商店)这样的大型网站呢? MOM 在那里解决了需要吗?

非常需要。

一个示例用例是扩展网页请求。当用户发出网页请求时,Web服务器将其放入后台处理队列中。这意味着Web服务器可以继续工作,而请求正在处理。这也意味着Web服务器不需要知道如何处理请求,使得系统维护、升级和回滚更加简单,因为主要部分是“解耦”的。

因此,网页请求最终将由后端服务处理,或者可能由许多服务处理,例如“查找书名”、“绘制购物车”、“获取广告”、“检查用户帐户”... 最终所有结果都被放入另一个队列中,等待Web服务器收集和用户响应。通常,系统会设置约100ms的超时时间,以便任何晚到的请求都被丢弃。用户在时间间隔内看到任何已经被处理的内容。这就是为什么一些大型电子商务网站出现了看似分阶段加载的页面的原因之一。

还有很多其他用例...

如果您编写的Web应用程序是在您控制的服务器端运行并具有同质化环境(例如运行Linux + Java JVM的数十个Amazon EC2实例),而客户端是Web浏览器,那么使用MOM是否有意义?

当你有一个未知或无限的用户数量、服务器端实例和应用延迟时,使用消息传递是有意义的,即使只是作为可扩展的非阻塞RPC的基础。

对于需要与服务器通信的桌面应用程序来说,这是否有意义?

在许多情况下有意义。一个非常常见的情况是当服务器将事件推送到桌面应用程序时,例如游戏事件、推文、金融中的价格提醒和系统警报等。

还是仅适用于大型企业,通常需要各种不同的系统进行某种方式的通信?

绝对不仅适用于那些“遗留集成”案例,但它们也很重要。在RabbitMQ中,我们最大的客户就是纯规模或消息量方面的云提供商和大型Web应用程序提供商。


6
我将只回答一个问题,基于我以前的经验 - 看看这个中间件,它被大公司所采用 - 中间件有一个目的 - 将不同语言编写的分离系统粘合在一起,以便它们可以相互交互并简化业务流程 - 我有过使用经验,Entera在UNIX系统上创建了一个中间层,使用C编写的进程通过PowerBuilder编写的前端与主机系统(DB2,COBOL)进行交互(我没有透露公司名称!)。
从我给出的描述中,Entera是一个托管许多东西的中间件 - 无论字节序格式如何,都能够平稳地集成数据流,不同语言能够与中间件代理(代理是遵循'The Open Group'的CORBADCE进程,它监听特定端口)通信,并由IDL指定,使进程显得像是本地的 - 如果您熟悉Microsoft .NET Framework下的Remoting术语,那么您就不会远离目标!中间件生成在编译时链接的存根,并管理进程的创建,将其托管到一个端口,运行时进行多线程处理,并且现代前端(例如.NET、Java、PowerBuilder甚至是不可言说的VB6...好吧...VB.NET适用于纯粹主义者)可以通过打开到特定IP地址上指定端口的连接,并使用生成的存根直接与之交互。
显然,从所描述的内容中,您可以看出遗留系统如何焕发新生命,因此该过程的可伸缩性,主要的缺点是成本因素,可能会达到数千美元。使用主机作为其后端处理系统进行计费/发票的大公司,可以显然负担得起这样一种昂贵的产品 - 对他们来说,这似乎就像把几分钱扔进水池中一样...由于使用中间件延长了业务流程并为其注入新的生命力,可以将业务延长多年而不必担心附着在其上的'遗留'标签。
顺便说一下,我曾经作为我的信息系统学士论文的一部分进行了这项工作,其中涵盖了这个商业前端。Sourceforge上有一个名为FreeDCE的开源版本的中间件,但开发工作已经减少或停止。

编辑: @cocotwo:正如你所说,中间件就像是一种管道工具...根据我所知,消息导向的中间件并不常见,因为我想象这些进程(函数)需要被调用,就像它们在前端应用程序域内本地可见一样,以便于易于互动。

使用消息可能比RPC调用更具有优势,因为消息会排队在一个安全保持区中,在网络断开连接时进行数据缓存,以允许前端继续运行...这对于“更新特定计费/发票编号的状态”等实例非常有用-通过中间件的单向写入数据到后端。

好的,大公司将拥有先进的系统基础设施,技术人员将全天候负责确保数据流顺畅,因此必须考虑到这一点。我曾经与IBM Global Support合同合作的公司合作,以确保最大的98.999999%的正常运行时间,同时采用热插拔/平衡集群/镜像系统...

而对于RPC,如果发生断开连接,则必须重新启动前端或处理断开事件。这确实取决于消息排队中间件是否实时处理每个消息,并立即将结果传递回前端...

这就是每个(消息排队和RPC相关的中间件)各自拥有其优点和缺点的地方...还有成本控制因素,如支持、最大正常运行时间、开发工作量和培训-这在这里非常重要,因为中间件实际上是私有的(尽管遵循“开放组”布局/标准),并且通过脚本将整个事物粘合在一起非常复杂。


@tommieb75: +1,没错,谢谢,这很有帮助,尤其是“中间件只有一个目的-将不同的系统粘合在一起”。我仍然希望得到其他人的意见或评论。关于免费解决方案,显然我在标题中提到的AMQP越来越受欢迎。尽管与之相关,但似乎已经被接受消息队列中间件不仅仅是“RPC”。我认为这一切非常令人困惑(我指的是情况的状态,而不是你的答案)。就目前而言,我认为这是“异构环境中具有遗留系统的管道技术”,但这可能对该技术有点苛刻。 - cocotwo

5
很好的答案和讨论。我们的咨询团队有两个首选的“消息传递”解决方案:RabittMQ和NXTera,一种高速RPC中间件,是上面提到的Entera的当代版本。我的合作伙伴和我已经开发了几个使用RabittMQ的解决方案,它是目前可用的最佳工具。此外,我碰巧在从事制造NXTera/Entera的公司工作。
从经验上来说,我可以清楚地说这两个产品都满足了上述可靠性和低维护性的需求。有些情况下,像RabittMQ这样的消息服务是正确的选择——需要发布和订阅、认证交付、排队或存储转发。
在其他情况下,RPC(远程过程调用)是企业或基于云的应用程序的事务处理和分布式处理的最佳和最快的解决方案。当使用RPC是正确的选择,但SOAP/.NET(是的,这些是RPC实现)太慢、昂贵或复杂时,像NXTera/Entera这样的轻量级高速RPC中间件就是我们的选择。
RPC中间件和面向消息的中间件之间存在一些用例重叠,在这种情况下,您可以成功地使用任何一种。但两者都是强大且可靠的选择。
我与之合作的大公司同时使用RPC和MoM。至于互联网公司,谷歌(Protocol Buffers)和Facebook(Thrift)表明RPC在现代Web和基于云的开发中有作用。

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