New Inter-Process Communication: Message-Oriented Middleware

Author:Once Day Date:2023年5月17日

本文主要翻译于《Message-oriented Middleware: Agile Systems for IT Success (g2.com)》一文,仅供学习和研究之用!

参考文档:

1. 概述

常见的系统内部进程间通信手段一般为Socket,虽然多数组件使用selectpollepoll等手段来轮询,进而搭配libevent等框架实现oneloop模型,但是仅靠不到千余行代码,在业务复杂化后,难免遇到各类问题。

典型的问题如下:

  1. 同步套接字存在超时问题,会导致虚假的业务处理失败。严重可影响流量转发。
  2. 单纯的非阻塞套接字并不能进行削波填谷,简单异步化处理也很彻底完善其逻辑。
  3. 每个ClientServer都要处理种数繁杂的套接字错误情况,处理好这些错误并不容易。
  4. 简易的Socket编程可定位太差,由于无法监视业务的实际消息,因此一旦业务发生问题,难以进行定位。

在这里,引入更优的中间件——面向消息的中间件(Message-Oriented Middleware , MOM)。

MOMMessage Oriented Middleware)是面向消息的中间件,使用消息传送提供者来协调消息传送操作。MOM 需要提供 API 和管理工具。客户端使用api调用,把消息发送到由提供者管理的目的地。在发送消息之后,客户端会继续执行其他工作,并且在接收方收到这个消息确认之前,提供者一直保留该消息。

最早的MOM标准是X/Open group在20世纪90年代提出的XATMI规范,它定义了进程间交互的API,实现包括Enduro/X中间件和Oracle Tuxedo

AMQP是另一个重要的基准,它定义了参与软件元素之间的通信协议和格式,以确保互操作性。AMQP提供了灵活的路由方案,事务管理、队列、安全性、管理、集群、联合和跨平台支持。

HLA标准由IEEE提出,用于仿真的互操作性。它指定了一系列可通过C++Java API访问的服务。该标准定义了基于发布/订阅的信息交换。它还包括同步数据交换、基于逻辑仿真时间的时间推进设施和同步点。

Java环境提供了一个供应商无关的API,称为JMS,用于使用Java编程语言发送和接收消息。 JMS API可减少企业消息传递专业知识,使Java开发人员能够构建广泛的消息传递应用程序,同时保持JMS提供程序实现之间的一定的可移植性。

XMPP是一种基于XML的通信协议,用于消息导向中间件。该协议还用于发布/订阅系统、VoIP信令、文件传输、视频、游戏、社交网络平台和物联网应用程序(如智能电网)。

从上述发展历史可以看出,MOM标准的演进呈现出由专有标准向开放标准的趋势,不断扩展应用范围,以满足不断变化的需求。这使得MOM中间件的使用更加方便和丰富。

2. 消息中间件工作基础原理

消息传递中间件改善了复杂IT系统的组件间通信。它使分布式环境中的开发更加轻松。

消息队列是面向消息的中间件平台中的一个关键组件。消息队列帮助基于mom的系统在体系结构中保留消息。面向消息的中间件架构可以在队列的帮助下发送和接收数据。

队列对于在面向消息的中间件体系结构中开发异步通信也是必需的。队列使用先进先出(FIFO)标准以特定顺序存储消息。最初发送到队列的消息将首先使用FIFO从队列中检索。

队列的标识、大小、队列保存阈值、消息过滤机制和其他属性都是可配置的。在大多数情况下,每个应用程序都有自己的队列; 然而,在某些情况下,设置允许应用程序共享队列。面向消息的中间件系统可以支持一系列队列。

在面向消息的中间件体系结构中,两种最流行的消息传递模型是发布/订阅(也称为发布/订阅)点对点(P2P) 模型。这两种方法都依赖于通过队列进行消息交换。典型的系统使用这两种方法的混合来实现各种消息传递目标。

下面是常见的消息中间件角色总结:

  • 发送者(Producer),负责将消息发送到消息队列中间件(MOM)。发送者可以是应用程序、服务或设备,它们生成消息并将其发布到队列或主题。发送者通常不关心消息的接收者是谁,它们只关心将消息发送到正确的队列或主题。
  • 接收者(Consumer),负责从MOM获取并处理消息。接收者可以是应用程序、服务或设备,它们订阅队列或主题以便接收消息。接收者在收到消息后可以执行相应的处理逻辑,例如更新数据库、触发事件或调用其他服务。接收者通常不关心消息来自哪个发送者。
  • 队列(Queue),是MOM中用于存储待处理消息的数据结构。队列的主要作用是缓存消息,确保在发送者和接收者间实现异步通信。队列通常提供先进先出(FIFO)的消息处理顺序,确保消息按照到达队列的顺序进行处理。
  • 消息体(Message),根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输。
  • 主题(Topic),是MOM中用于实现发布/订阅模式的一种概念。与队列类似,主题也用于存储待处理消息。然而,主题允许多个接收者订阅同一主题以接收消息。这意味着当发送者向主题发送消息时,所有订阅该主题的接收者都将收到该消息。这有助于实现一对多通信。
  • 代理(Broker),是MOM系统的核心组件,负责消息的传递、存储和路由。代理接收来自发送者的消息,将其存储在队列或主题中,然后根据需要将消息路由到接收者。代理还负责处理消息确认、事务以及其他MOM特性。代理可以是集中式的,也可以是分布式的。
  • 管理员(Administrator),负责配置、监控和管理MOM系统。管理员的职责包括创建和删除队列、设置路由规则、分配资源、授权访问权限等。管理员通常使用MOM提供的管理控制工具来执行这些任务。管理员还负责确保MOM系统的安全性和稳定性。

3. 常见中间件类型总结

中间件是不同软件架构之间交互的抽象层,可以屏蔽不同架构之间的差异,提供统一的抽象接口,下面是常见的中间件类型:

  • 面向消息的中间件(MOM)(Message-oriented middleware),是一种允许应用程序组件之间接收和转发消息的架构。它支持跨多个平台的软件部署,并简化了开发跨多个操作系统和网络协议的应用程序的过程。与其他中间件相比(例如硬编码逻辑),它有几个优点,是使用最广泛的中间件形式之一。

  • 对象中间件(Object middleware),也称为对象请求代理,使应用程序可以通过面向对象的系统交换对象和访问服务。简而言之,它控制分布式计算系统中的对象通信。

  • 远程过程调用(RPC)中间件(Remote procedure call middleware),或基于RPC的中间件,允许一个应用程序中的过程调用其他应用程序中的过程,就像它们是本地调用一样。该中间件包含一种链接机制,用于定位远程操作并透明地向客户端提供这些操作。基于rpc的中间件过去处理基于过程的系统,但现在合并了基于对象的组件。

  • 事务处理(TP)中间件(Transaction processing middleware),包括诸如事务处理监视器之类的系统。它还包括web应用服务器。它的目标是为开发和部署各种应用程序创建一个环境。

  • 数据库中间件(Database middleware),支持直接访问数据库。它有助于实现与数据库的直接交互,并包括几个数据库网关和连接选项。

  • 嵌入式中间件(Embedded middleware),也称为集成中间件,帮助企业通过程序或硬件接口开发和交付更好的集成框架。它是嵌入式应用程序和实时操作系统之间的桥梁。

  • 门户网站(Portals),也称为企业门户网站,从技术上讲并不是一种中间件。然而,它们被归类为中间件,因为它们允许前端集成并促进客户端机器和后端平台之间的交互。

  • 以内容为中心的中间件(Content-centric middleware),通过提供者-消费者抽象获取内容,并广泛应用于基于内容的系统中。它可以与发布/订阅中间件相媲美,后者是另一种经常作为基于web的应用程序组件使用的软件。

4. 面向消息中间件对比(MOM vs RPC)

面向消息使用的中间件有两种:

  • 基于远程过程调用(Remote Procedure Call, RPC)的中间件,允许一个应用程序中的过程调用远程应用程序中的过程,就好像它们是本地调用一样。该中间件实现一个查找远程过程的链接机制并使调用方能够以透明方式使用这些过程。以前,这种类型的中间件处理基于过程的程序;现在,它还包括基于对象的组件。
  • 基于对象请求代理 (Object Request Broker, ORB) 的中间件,使应用程序的对象能够在异类网络之间分布和共享。
  • 面向消息的中间件(Message-Oriented Middleware,MOM),使分布式应用程序可以通过发送和接收消息来进行通信和交换数据。

这两类模型都可以使一个本地组件通过网络协议访问(影响)另一个远程组件。区别在于RPC中间件调用远程组件时是同步操作,必须等待调用过程返回才能往下执行。而MOM中间件则通过高效可靠的消息传递机制进行异步数据传输。

下面是MOM (消息队列) 与 RPC (远程过程调用) 的对比:

性能方面:

  • MOM:消息队列使用异步通信,可以在发送者和接收者之间提供一种缓冲机制。这可以提高性能,特别是在高并发的情况下。但是,消息传递的序列化和反序列化可能会带来额外的性能开销。

  • RPC:远程过程调用使用同步通信,通常在调用方等待结果返回之前会阻塞。这可能导致性能下降,但是由于不需要序列化和反序列化消息,RPC 通常比 MOM 更快。

稳定性方面:

  • MOM:消息队列具有很高的稳定性,因为发送者和接收者之间的通信是解耦的。即使接收者出现故障或者无法处理请求,发送者也可以继续工作。

  • RPC:远程过程调用的稳定性可能较低,因为它依赖于调用方和被调用方之间的直接通信。如果被调用方出现故障或无法处理请求,调用方可能会受到影响。

可定位性方面:

  • MOM:由于消息队列的异步特性,调试和定位问题可能变得困难。要识别问题,可能需要跟踪和分析消息队列中的消息流。

  • RPC:远程过程调用使得调试和定位问题相对容易,因为它使用同步通信。调用方和被调用方之间的请求和响应可以直接进行跟踪和分析。

故障处理能力:

  • MOM:消息队列具有较好的故障处理能力,因为发送者和接收者之间的通信是解耦的。如果接收方出现故障,发送方可以继续将消息发送到队列,等待接收方恢复。

  • RPC:远程过程调用的故障处理能力较弱。如果被调用方出现故障,调用方可能会受到影响,需要实现额外的容错机制。

编程复杂性:

  • MOM:消息队列可能会导致编程复杂性增加,因为需要处理序列化、反序列化和消息传递等问题。

  • RPC:远程过程调用通常具有较低的编程复杂性,因为它类似于本地函数调用。

可维护性

  • MOM:消息队列的可维护性较高,因为发送者和接收者之间的通信是解耦的。这使得系统的各个部分可以独立地进行更新和维护。

  • RPC:远程过程调用的可维护性可能较低,因为它依赖于调用方和被调用方之间的直接通信。这可能在系统的各个部分之间引入耦合,使得更新和维护变得困难。

应用实例:

  • MOM:消息队列广泛应用于分布式系统、微服务架构和大型企业应用。例如,Apache Kafka 和 RabbitMQ 是两个广泛使用的消息队列系统。

  • RPC:远程过程调用常用于分布式系统或者需要调用远程服务的场景。gRPC 和 Apache Thrift 是两个广泛使用的 RPC 框架。

5. 面向消息中间件的特性

(1)异步消息(Asynchronous messaging):

异步消息允许发送者和接收者在不同的时间进行通信,而无需等待对方。消息队列中间件(MOM)通过将消息存储在队列中,使这种通信成为可能。发送者可以将消息发送到队列,而接收者可以在稍后的时间从队列中获取消息。这种方式有助于实现解耦和可伸缩性。

(2)可靠消息传递(Assured message delivery):

MOM确保消息可靠地传递给接收者,即使在系统故障的情况下也能保证。MOM通常提供持久性、消息确认(ACK)和消息重试等机制来确保消息不会丢失。

(3)路径选择(Routing):

路径选择是指MOM基于特定规则或策略选择消息在系统中的传输路径。这可以包括基于优先级、负载均衡或特定的路由规则来选择适当的路径。这有助于实现高效的消息传递和资源利用。

(4)消息转换机制(Transformation):

消息转换机制允许MOM在发送者和接收者之间转换消息的格式。这在跨平台或异构系统间通信时非常有用,因为它可以确保接收方能够理解发送方发送的消息。转换可以包括数据格式、编码、压缩或协议转换。

(5)事务支持(Transaction support):

事务支持允许MOM在事务上下文中处理消息。这意味着一组相关的消息可以作为一个原子单元进行处理,从而确保数据的一致性和完整性。如果事务成功,则所有消息都将被成功处理;如果事务失败,则所有消息都将回滚到事务开始之前的状态。

(6)通告服务(Notification services):

通告服务允许MOM在特定事件发生时向订阅者发送通知。这可以包括系统故障、队列满载、资源不足等。这有助于实现实时的系统监控和故障诊断。

(7)监控(Monitoring):

MOM通常提供监控功能,以实时监控系统的运行状况。这可能包括监控队列长度、消息传递速率、错误率、资源利用率等。监控功能可以帮助运维人员识别潜在问题并采取相应措施。

(8)管理控制(Management and control):

管理控制允许运维人员配置和管理MOM系统。这可能包括添加或删除队列、修改队列属性、设置路由规则、授权用户访问等。管理控制功能可以确保MOM系统的安全性和稳定性。

6. MOM面向消息中间件总结

面向消息的中间件(Message-Oriented Middleware,MOM)是一种用于支持异步通信和消息传递的软件组件。它提供了在分布式系统中传递消息的基础设施,同时支持多种通信模式,如点对点(P2P)和发布/订阅(pub/sub)模式。下面总结了一下MOM的优点、缺点、设计思路和注意事项。

优点:

  1. 解耦:MOM可以将发送者和接收者解耦,使得系统组件之间的依赖性降低,提高了系统的可扩展性和可维护性。
  2. 异步通信:MOM支持异步通信,发送者和接收者不需要同时在线,可以在不同的时间处理消息。这有助于提高系统的响应速度和处理能力。
  3. 负载均衡:MOM可以根据系统的负载情况,自动调整消息的传输速度和处理能力,从而实现负载均衡。
  4. 容错处理:MOM提供了消息持久化、消息重试和死信队列等机制,可以在系统出现故障时保证消息的可靠传递。
  5. 跨平台和跨语言:MOM一般支持多种编程语言和平台,可以方便地实现跨平台和跨语言的通信。

缺点:

  1. 性能开销:MOM引入了额外的消息传输、序列化和反序列化等开销,可能会影响系统的性能。
  2. 复杂性:使用MOM需要学习和理解相关的概念、技术和工具,可能会增加系统的复杂性。
  3. 可用性:MOM通常依赖于外部的消息代理服务,如果消息代理服务出现故障,可能会影响系统的可用性。

设计思路:

  1. 选择合适的通信模式:根据系统的需求,选择合适的通信模式,如点对点(P2P)或发布/订阅(pub/sub)模式。
  2. 保证消息的可靠传递:使用持久化、消息确认和重试等机制,确保消息在系统中可靠地传递。
  3. 提高消息处理的性能:使用消息批处理、并行处理和异步处理等技术,提高系统处理消息的性能。
  4. 设计合理的消息格式:根据系统的需求,设计合理的消息格式,如使用JSON、XML或二进制格式。

注意事项:

  1. 确保消息的幂等性:在系统中处理消息时,需要确保消息的幂等性,防止因为消息重复导致的数据不一致问题。
  2. 监控和管理消息队列:对消息队列进行监控和管理,及时发现和解决系统中的问题。
  3. 优化消息代理服务的性能和可用性:根据系统的需求,优化消息代理服务的性能和可用性,如使用集群、分区和备份等技术。
    理的消息格式,如使用JSON、XML或二进制格式。
05-30 02:04