什么是消息代理?
应用程序的通信方式正成为越来越大的挑战。使用消息传递中间件简化了这一挑战,并且允许通用的通信基础架构增长和扩展以满足最苛刻的条件。但是,通信可采用多种不同的形式,消息传递中间件提供通信的方式也不例外。
消息传递中间件使用的一种通信方法是基于服务器模式,它采用了消息代理。借助消息代理,源应用程序(生产者)向服务器进程发送消息,该进程可以提供数据编排、路由、消息转换、持久性和传递到所有适当的目的地(消费者)。消息代理的决定性特征是代理本身就是一项独立的服务。生产者和消费者使用标准或专有协议与代理进行沟通。消息代理通常提供客户端的所有状态管理和跟踪功能,这样单个应用程序就不需要承担这一责任,消息传递的复杂性也内置于消息代理本身。
与消息代理的沟通有两种基本形式:
- 发布和订阅(主题)
- 点对点(队列)

发布和订阅消息
在发布和订阅消息系统中,创建者就一个主题发送消息。在这种模型中,创建者被称为出版商,消费者被称为订阅者。一个或多个出版商可以就同一主题发布,许多订阅者可以接收来自一个或多个出版商的消息。订阅者订阅主题,所有关于该主题的订阅者都会收到就该主题发布的所有消息。该模型根据应用程序订阅的主题提供了简单的兴趣驱动交付。
点对点通信
点对点通信最简单的形式是具有一个生产者和一个消费者。这种消息传递方式通常使用队列来存储由生产者发送的消息,直到消费者收到消息为止。消息生产者将消息发送到队列;消息消费者从队列中检索消息并发送确认消息已接收。多个生产者可以向同一队列发送消息,多个消费者可以从同一队列中检索消息。当使用多个消费者时,每个消费者通常会收到消息流的一部分以允许并发处理。
基于服务器的消息代理
基于服务器的消息代理具有许多优势,包括集中处理、集中式消息分发和集中式数据持久性。示例包括许多专有消息代理、Java 消息服务 (JMS) 实施以及开源产品,例如 Apache Kafka、Apache Pulsar 和 Eclipse Mosquitto。
在某些情况下,需要一种分散的通信模式。这种"无代理"或点对点方法通常提供了一种机制来支持应用程序之间的直接通信,以满足需要非常低的延迟的用例。