论文 《分布式系统的现代消息传递》Modern Messaging for Distributed Sytems
L Magnoni
通过IOP出版有限公司出版许可物理学学报:会议系列, 608卷, 第1会议
作者电子邮件
作者隶属关系
1欧洲核子研究中心,欧洲粒子物理实验室(CERN),瑞士日内瓦
引文
L Magnoni 2015 J. 物理学:Conf。序列。608 012038
抽象
现代软件应用程序很少孤立存在,而现在通常的做法是依赖服务或使用远程实体提供的信息。
在这种分布式架构中,集成是关键。
十多年来,消息传递是解决分布式性质挑战的参考解决方案,例如网络不可靠性,
生产者和消费者的强烈耦合以及应用的异质性。
由于强大的社区以及对标准和整合的共同努力,消息代理如今已成为许多项目和服务的传输层构建块,
无论是在物理界还是在外面。此外,近年来出现了新一代的消息服务,
重点关注低延迟和高性能用例,突破了消息传递应用程序的界限。
本文将介绍分布式应用程序的消息传递解决方案,概述主要概念,技术和服务。
1.介绍
本文概述了消息传递概念,功能和现代技术。
首先介绍分布式通信和系统集成的消息传递。
然后提供对主要消息传递功能的回顾,然后概述从代理到无代理系统的消息传递的主要技术。
最后,介绍了有关使用消息传递解决分布式应用程序通信问题的成功案例列表。
2.用于松散耦合通信的消息传递
现代分布式系统可以包括数百个(如果不是数千个)应用程序以多层操作,并为彼此提供不同的服务和功能。
在这样的分布式架构,存在诸如网络不可靠性,强耦合等诸多挑战,生产者和消费者以及需要的应用程序的异构性,致力于建立一个坚实可靠的系统。
2.1 面向连接的通信
面向连接的通信是在远程实体之间交换信息的简单解决方案。如图1所示,考虑通过面向连接的协议(如TCP / IP)打开套接字,并通过它传输原始数据流。这将是一种快速而廉价的信息交换方式,但与此同时,紧密耦合的通信将基于许多假设,这些假设需要满足才能进行通信:
图1:紧密耦合的通信。
2.2 用于松散耦合通信的消息传递
耦合可以通过各方在沟通时相互作出的假设数来衡量。
消息传递是松耦合通信解决方案的一个示例,其中消息是信息构建块,其目的在于最小化这些假设。
它不是直接向特定地址发送信息,而是发送到可寻址信道,以解决位置依赖性。
为了消除时间依赖性,可以增强该信道以对信息进行排队,直到远程组件准备好接收它为止。
这样,生产者现在可以将请求发送到通道并继续处理,而不必担心交付。
消息传递不对数据表示做出任何假设,因此标准数据格式(例如,自描述和与JSON或XML无关的平台)可用于消除在所有组件之间共享数据处理逻辑的需要。
2.3消息传递方案
典型的消息传递用例是:
信息发布:实体发布易变信息而没有关于谁感兴趣的先验知识(例如传感器);
信息存储:实体从多个来源(例如日志收集器)收集信息;
远程过程调用:实体向一个或多个远程实体发送请求并期望回复。
2.4消息传递中间件
消息传递是一种松散耦合的通信解决方案,可最大限度地减少生产者和消费者的依赖,删除这些依赖项使整个架构更灵活,更容忍变更,但它带来了额外的复杂性。
因此,多年来已经开发了专用消息中间件以提供消息传递功能而无需处理内部复杂性。
下一节将介绍消息传递系统的主要概念和原理。
3.消息系统
如图2所示,消息传递系统充当想要通信的实体之间的间接层。
通常称为消息代理,它负责将数据作为消息从一个应用程序传输到另一个应用程序,
这样生产者和消费者就可以专注于分享内容,而不是如何分享内容。
与许多其他技术一样,消息传递基于一些基本概念和属性,这些概念和属性在所有不同的风格和实现之间共享。
图2:松散耦合通信的消息传递。
3.1 信息
消息是信息构建块。它由一个主体组成,它是不可变的,包含通信的结构化数据(例如JSON,XML,序列化协议)对象,以及一组头,通常是可由代理处理并用于路由的键值对。
3.2 通信模型:主题和队列
消息传递系统支持不同的通信模型,每个模型定义了生产者和消费者之间如何交换信息。 最常见的通信模型是队列和主题。 队列用于实现点对点通信,其中,如果在生成信息时不存在消费者,则消息将保留在通道中以供以后传递, 如果有多个消费者,则消息仅传送一次。 主题是针对经典发布/订阅方案, 如果不存在消费者,则消息被丢弃,并且在多个消费者的情况下,消息系统将消息传递给每个消费者。 来自队列和主题的部分被广泛支持,更复杂的传递语义存在于协议级别(例如来自AMQP的交换/节点)以及许多其他中间件特定的。
3.3 协议
多年来,缺乏与消息代理交互的独特标准方式已成为消息传递技术的已知问题。 AMQP协议由主要的消息传递参与者,公司和软件生产者设计,以克服这一限制。 然而,定义有线通信和传递语义的统一协议的内部复杂性要求消息传递系统的主要开发工作变得完全兼容。 本节概述了主消息系统当前支持的最常见的标准协议。 对于面向消息的体系结构,协议选择是一个关键的设计决策,就其在应用程序中的强耦合而言。
3.3.1 AMQP(高级消息队列协议)[1]是标准化工作的结果消息传递领域的主要贡献者(例如思科,微软,红帽,银行)。 它是旨在实现不同消息传递系统之间的互操作性。 它提供了定义二进制线协议和完整的传递语义,理论上允许AMQP消息传递客户端能够与不同的代理实现无缝交互符合AMQP标准。 如今,该协议的最新稳定版本(1.1)的奉献是尚未广泛,但鉴于它已经得到了主要消息代理的支持,预计未来几年将更广泛地实施。
3.3.2 STOMP(流式文本定向消息传递协议)[2]是基于文本的协议意味着简单且可广泛互操作。 它主要是一种有线协议,它非常有用基本的消息传递语义内置(例如,不支持通信模型,目的地是只是一个字符串消息头), 需要在消息系统级别进行适当的配置(例如,目的地必须适当地映射到队列或主题)。 多亏了它简单,有许多语言提供的广泛的客户端,它是由支持大多数经纪人。
3.3.3 MQTT(Message Queue遥测传输)[3]是轻量级协议设计的最初来自IBM。 它适用于低带宽,高延迟的网络。 它定义了一个紧凑的二进制格式,通信开销非常有限,几十字节,这使得它适用于简单的物联网风格应用(例如移动电话,传感器)生产 - 忘记的情景。
3.4功能 如第2节所述,消息传递系统可以被视为中间通道通过排队等附加功能进行增强,以改善通信远程实体的经验。 多年来,虽然没有正式的协议,但不同消息传递系统融合在一组共同的功能上,这些功能已成为事实上的标准用于消息传递中间件。 功能列表包括Persistence,即保存功能永久存储上的消息,例如文件系统或数据库;故障转移,允许客户端经纪人失败时自动重新连接; 保证交付,定义政策用于消息传递(例如,至少一次或完全一次); 订购,发送消息它们的生产顺序; 交易,将多个请求视为一部分的能力分布式事务,具有回滚选项和聚类,这是创建的可能性消息代理网络,用于高可用性和负载平衡。 尽管如此,每个消息系统可以为相同的功能提供不同的解释。许多其他独特的经纪人特定存在功能,但它们的使用意味着将应用程序与特定代理硬连接味道。
4.消息传递技术
面向消息的中间件已经发展了十多年,现在已经成为一个丰富而稳固的服务和库生态系统。
消息代理作为为分布式应用程序提供消息传递功能的中间独立服务,是最常见的消息传递系统类型。
多年来,消息代理已广泛用于在分布式系统中实现通信和集成[4],但数据密集型和高性能用例除外,
中间实体的存在不适合的选择。
近年来,出现了新一代消息传递系统,重点关注低延迟和高性能用例,突破了消息传递应用程序的界限。
下一节将介绍主要消息传递技术的概述。
4.1 消息代理
消息代理是消息系统最常见的实现。
消息代理是独立的中间实体,它通过标准或自定义协议提供消息传递功能。
存在许多消息代理,不同的功能,协议,实现语言,平台支持。
本评论的重点是开源解决方案,但许多也作为企业商业软件的一部分存在。
消息代理是功能最丰富的消息传递系统类型,具有协议支持的功能,如第2节所述。
经纪人可以是多语言,允许生产者和消费者使用不同的协议(例如AMQP上的发送者,STOMP上的接收者)
并且它们可以支持消息转换(例如,将消息有效负载从XML转换为JSON)以进一步解耦应用程序。
4.1.1 ActiveMQ是最广泛采用的开源消息代理之一。
它是一个Apache项目,用Java编写,得到了Red Hat的商业支持。
ActiveMQ具有广泛的协议支持(例如AMQP,STOMP,MQTT,Openwire,HTTP和许多其他),
它提供了许多跨语言客户端,并且完全符合JMS标准。
ActiveMQ提供了许多高级功能,例如:丰富的语义传递(例如虚拟队列,复合目标,通配符),
JDBC消息存储(例如,用于在任何JDBC兼容数据库中保留消息)和高级群集配置(例如,主从,经纪人网络)。
ActiveMQ是一种功能完备的消息传递解决方案,可用于实现许多通信和集成模式[4]。
4.1.2 RabbitMQ 是一个用Erlang编写的轻量级开源消息代理,它从下面语言的消息传递功能中获益。
RabbitMQ架构是深度模块化的,它主要支持AMQP和STOMP,但是附加协议可以作为插件加载(例如MQTT,HTTP)。
它支持主要的消息传递功能,例如持久性,群集,高可用性和联合。
RabbitMQ仍然是一种轻量级的消息传递解决方案,由于其简单性和可靠性,可以嵌入到多个项目(例如Logstash)中。
4.1.3性能和可伸缩性 对于消息传递系统,没有详细的上下文化,每秒消息的量化度量(msg / s)几乎没有意义。
使用的协议(例如二进制或文本)起着重要作用,但存在许多其他延迟因素:
持久性消息可以慢几个数量级,放大因子(例如主题消费者的数量)可以通过多个内存中的消息副本影响系统,
对于有效载荷大小也是如此。次优的客户端可能导致大量的开/关连接,行为不端的消费者可能导致低用户问题,
消息传递基础结构最常见的问题之一。
[5]中的比较,其中几个消息代理通过STOMP协议在几个通信模型中进行评估,显示了在实际情况下如何
性能可能在100000 msg / s和1000 msg / s之间变化。
4.2 Apache Kafka
Apache Kafka是一个最初来自LinkedIn的开源项目,现在是Apache基金会的一部分。
它已经被开发用于实时活动流分析,以解决对从生产者向许多潜在消费者移动大量数据(例如,用户指标,计算机农场监控)的有效方式的需求。
规模和数据大小(数十亿条消息和每天数百千兆字节)和时间限制使得用例不适合标准经纪人,如[6]中的比较。
Kafka的创新理念是成为无国籍经纪人,因此不保留任何有关消费者的信息。
消费者必须保留其自己的状态(例如关于最后读取的数据的信息)并在需要时向Kafka轮询新数据。
这允许Kafka独立于消费者的数量来保留单个消息副本(例如,消费时不会删除消息,而是通过保留期或其他策略删除消息),
从而实现读取和写入操作的高吞吐量。
Kafka持久性是作为分布式提交日志实现的,如图3所示,设计为易于扩展的分布式系统(基于Zookeeper),允许自动平衡消费者/生产者/代理。
(a)Kafka集群
(b)Kafka主题分区
图3:Kafka架构。
与标准消息代理相比,Kafka提供有限的消息传递功能(例如主要是主题语义,文件系统作为唯一持久存储,严格保证排序)。
尽管有许多客户端库可用,但它仅支持TCP上的自定义二进制格式。
Kafka是数据移动的最佳解决方案,经常被用作不同处理系统(例如Hadoop,Storm)的管道。
4.3 ZeroMQ
尽管名称如此,ZeroMQ(也称为0MQ或ZMQ)[7]不是标准的消息代理,而是一个提供消息传递功能的轻量级消息传递库。
分布式应用程序可以使用ZeroMQ进行高吞吐量和低延迟通信,
利用其在生产者和消费者之间实现直接联系的能力,
没有涉及中间实体。虽然这可能与消息传递的主要假设之一相矛盾,
ZeroMQ通过创新方法实现松耦合通信,充当网络堆栈的新层。
它使用类似的API扩展了socket的概念,但内置了消息传递模式:
请求/回复,发布/订阅,流水线和独占对,如图4所示。
(a)请求/回复
(b)发布/订阅
图4:ZeroMQ套接字的示例。
与经典套接字相比,每个ZeroMQ套接字都带有一个内部队列,以允许异步通信。
结果是,例如在用于点对点通信的请求/回复场景中,
如果在消费者未运行时生成数据,
ZeroMQ库将负责延迟交付,而生产者方无需额外负载。
ZeroMQ背后的理念是强大的,它允许高性能和低延迟的通信,但在应用程序级别具有额外的复杂性。
ZeroMQ主要支持自己的二进制协议,并提供有限的消息传递功能(例如,故障转移,1-N拓扑的多播支持)。
虽然可以使用ZMQ API轻松实现多个功能(例如确认),
实现高级消息传递功能(例如保证传递,持久性)可能需要相当大的努力,
使其适用于需要简单消息语义的数据广告场景。
5.用例
本节介绍了几种成功采用基于消息传递通信的用例,以解决分布式系统中的交换信息问题。
5.1 CERN Beam Control中间件
CERN实验室的光束控制部门正在为大型强子对撞机(LHC)的高可靠性控制/监控/报警应用使用信息。
自2005年以来,一组ActiveMQ经纪人,在商店和正向配置中,
用于收集安全系统生成的关键数据(例如30个生产者,2MB / s,4.5K msg / s)并将其转发给许多消费者(例如监控工具,仪表板)。
作为安全数据关键任务,存储和转发配置允许将数据生成与消耗完全分离,防止行为不端的客户端进行数据收集和归档[8]。
此外,LHC Control框架最近已从CORBA迁移到ZeroMQ作为通信层[9]。
5.2 DAQ在线监测
消息传递还广泛用于数据采集(DAQ)系统的几个监控工具,
负责从检测器(例如高能物理实验)过滤和收集数据到存储设施。
5.2.1 ATLAS TDAQ移位器助手项目[10]依靠消息传递将业务警报从私有TDAQ网络分发到GPN到许多异构消费者。
ActiveMQ群集用于主/从配置,以最大限度地减少对单个出站连接所需的防火墙配置的影响。
5.2.2 STAR Online框架依赖于基于AMQP的系统,可灵活,松散地耦合检测器元数据,
使用消息传递作为统一传输层进行处理,
存储和监控。 此外,已经进行了调查以重新编写MQTT上的控制框架,从协议的灵活性和互操作性中获益[11]。
5.3 WLCG消息服务
消息传递也已成功用于大规模地理分布式基础设施。
WLCG(全球LHC计算网格)消息服务是用于监控全球WLCG站点和服务的骨干传输层,
拥有超过50000个客户端,平均消息速率为100 KHz。 监视基础结构基于具有JSON有效负载的STOMP。
由于STOMP协议在多种代理风格中的互操作性,
异构消息代理群集(ActiveMQ,Apollo或RabbitMQ)用于客户端应用程序生成任何内容并消费给所有人[12]的场景。
6.总结
消息传递从根本上说是对分布式系统问题的实用反应[4]。
如第2节所述,它允许松散耦合的通信作为生产者和消费者之间的中间层。
它为分布式应用程序的灵活性和可伸缩性带来了许多好处,并对应用程序和基础架构的复
消息系统仍然是不断发展的技术,如第3节所示,AMQP标准化工作指向了良好的方向,
但仍然部分采用。
消息代理是在许多项目和服务中用作传输层构建块的可靠且可靠的技术,
无论是在物理界还是在外面。近年来,
新一代系统正在推动低延迟/高吞吐量/数据密集型通信的消息传递,
如第5节所述,缩小用例和放松假设,但将消息传递应用程序的界限推向新的领域。
参考
[1] AMQP(高级消息队列协议)http://www.amqp.org
[2] STOMP(简单文本导向消息传递协议)http://stomp.gith ub.io [3] MQTT(MQ遥测传输)http://mqtt.org
[4] G Hohpe和B Woolf 2003 企业集成模式 Addison-Wesley Professional [5] Chirino H STOMP基准http://hiramchirino.com/stomp-benchmark
[6] Kreps J,Narkhede N和Rao J Kafka:用于日志处理的分布式消息系统。NetDB研讨会(雅典,希腊)
[7] Hintjens P ZeroMQ:指南http://zeromq.org
[8] Ehm F 为CERN的控制系统运行可靠的消息传递基础设施。 ICALEPCS2011会议录(法国格勒诺布尔)
[9] Dworak A,Ehm F,Sliwinski W和Sobczak M 2011 中间件趋势和市场领导者2011。
ICALEPCS2011会议录(法国格勒诺布尔)
[10] Kazarov A,Miotto GL和Magnoni L 2012 AAL项目:ATLAS数据采集基础设施的自动监测和智能分析。物理学杂志:会议系列,第368卷
[11] Arkhipkin D,Lauret J和Betts W 2011 STARs在线监控和元数据收集的消息排队框架。物理学杂志:会议系列,第331卷
[12] Cons L和Paladin M 2011 WLCG消息服务及其未来。物理学杂志:会议系列,第396卷