面向消息的中间件 (MOM)
什么是 MOM
面向消息的中间件(Message Oriented Middleware,简称 MOM)利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来实现分布式系统的集成。
一个典型的 MOM 架构通常包含客户端、消息以及中间件本身。客户端是发送或接收消息的应用程序,消息封装了待传递的内容,而 MOM 负责存储和转发。在实际场景中,系统 A 和系统 B 之间的交互往往不是直接通信,而是通过中间件间接完成,这有效隔离了双方的依赖关系。
MOM 带来的优势
降低通信复杂度 引入 MOM 后,系统间的通信不再受限于开发语言或复杂的网络编程细节。各个系统只需关注自身与 MOM 之间如何通过简单的 API 进行消息收发,底层传输逻辑由中间件屏蔽。
提升消息灵活性 系统 A 向系统 B 发送消息时,消息会暂存在 MOM 中。即使系统 B 暂时离线,MOM 也会持有该消息,直到 B 上线并处理完毕。这意味着系统 A 发完消息后即可执行其他操作,无需阻塞等待,特别适合时间无关或并行处理的业务场景。
实现松散耦合 有了 MOM 的存在,对于消费者而言,只要消息格式不变,就不必关心生产者的具体变化。A 系统的代码调整不会直接影响 B 系统,反之亦然,极大地提升了系统的可维护性。
JMS 核心概念
JMS 是什么
Java 消息服务(Java Message Service,JMS)是 Java 平台中关于面向消息中间件的 API 规范,用于在两个应用程序之间或分布式系统中发送消息,进行异步通信。作为一个与具体平台无关的接口,绝大多数主流 MOM 提供商都对 JMS 提供支持。
JMS 规范定义了两种主要的消息模式:点对点(Point-to-Point)和发布/订阅(Publish/Subscribe),同时支持同步和异步的消息处理方式。
一个标准的 JMS 系统通常包含以下组件:
- JMS Client:使用 Java 编写的客户端,负责发送和接收消息。
- Non-JMS Client:使用消息系统本地 API 而非 JMS API 编写的客户端。
- Message:被定义的消息对象,用于在不同客户端间交换数据。
- JMS Provider:消息系统本身(如 ActiveMQ),既支持 JMS 也支持本地 API。
- Administered Objects:预置的管理对象,方便客户端直接使用。
JMS 规范说明
需要明确的是,JMS 规范仅定义了接口标准,并未提供具体实现。完整的规范文档可参考 JSR 914: Java Message Service (JMS) API。
JMS 消息模型详解
JMS 主要支持两种消息通信模型,理解它们的区别对设计系统至关重要。
点对点模型 (P2P)
在点对点模型中,Sender 将消息发送到 Queue(队列)中。这条消息具有排他性,只能由一个客户端消费;一旦消息被处理,其他客户端将无法从该队列中获取到它。这就好比巧克力盒子里只有一块糖,只有最先打开的人能吃到,后来者自然就没有了。
关键特性:
- 单一消费者:每条消息仅能被一个消费者处理,消费后其他消费者不可见。
- 时间无关性:消息消费与发送时间解耦。只要消息未过期且未被消费,客户端可以在任意时刻来取用。
- 确认机制:消费者收到消息后必须向 Provider 确认,否则可能被视为未消费。虽然可以设置自动确认,但这正是保证'一条消息只被消费一次'的关键保障。
- 持久化策略:非持久化消息可能会因 Provider 宕机或过期而丢失;持久化消息则会被写入文件系统或数据库,确保在异常情况下也能严格投递一次。
发布者/订阅者模型 (Pub/Sub)
与 P2P 不同,Pub/Sub 模型中,一个消息主题(Topic)被发布后,可以有多个订阅者收听。所有订阅了该主题的订阅者都能获取到消息,但前提是它们必须在订阅之后才能接收,之前的历史消息无法追溯。这就像订阅期刊,我们只能收到订阅生效后的刊物,杂志社不会补发之前的期数。
关键特性:


