面向消息的中间件
随着系统变大变复杂,一个大的系统,开始向着领域模型和微服务架构演进。而各个子系统之间的通信开始变得复杂、重要。不过总的来说还是分两类:同步通信和异步通信。对于同步通信,现在通俗的做法有REST、RPC、SOAP等。对于异步,现在用的最多就是面向消息的中间件(Message Oriented Middleware,MOM)。
我们知道异步通信一般有两个问题,一是发送方进程与消息服务端进程要都正常运行,二是只能点对点通信。MOM就很好的解决了这两个问题。
首先,发送方将消息发送给消息服务器,消息服务器将消息存放在若干队列中,当消息接收方接收消息时,再将消息转发给接收方。这种情况下,消息的发送和接收都是异步的,发送方无需等待即可发送,接收方接收消息的时候发送方可以不运行,即两方的运行状况不受彼此影响。另外,可以一对多通信,一个消息可以有多个接收者。
JMS概述
JMS全称Java消息服务(Java Message Service)。 官方文档给的解释是:Java消息服务(JMS) API是一个消息传递标准,允许基于Java平台Enterprise Edition (Java EE)的应用程序组件创建、发送、接收和读取消息。它支持松散耦合、可靠和异步的分布式通信。说白了,JMS就是定义一套规范,构建一个生产者-消费者的消息队列模型,只是没有实现。所以有Java消息服务是一个与具体平台无关的API的说法。目前绝大多数MOM提供商都对JMS提供了支持,实现JMS 接口的消息中间件称为JMS Provider,比如ActiveMQ、Tibco EMS。我用的是后者。
JMS功能
JMS规范包含点对点(Point to Point,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。
JMS术语
JMS Provider:实现JMS 接口的消息中间件;PTP:Point to Point,即点对点的消息模型;
Pub/Sub:Publish/Subscribe,即发布/订阅的消息模型;
Queue:队列目标;
Topic:主题目标;
ConnectionFactory:连接工厂,JMS 用它创建连接;
Connection:JMS 客户端到JMS Provider 的连接;
Destination:消息的目的地;
Session:会话,一个发送或接收消息的线程;
MessageProducer:由Session 对象创建的用来发送消息的对象;
MessageConsumer:由Session 对象创建的用来接收消息的对象;
Acknowledge:签收,可靠传输的保证。
Transaction:事务。
JMS的收发
看了这么多JMS概念,先简单看下JMS的收发message的步骤。下面两张图,一张是Producer 向EMS发送message,另一个张是Consumer从EMS接收message的步骤。
发送消息:
接收消息:
这里要说一下,Session 是一个继承 Runnable 的接口。也就是说,Connection 通过创建新的线程来跟中间件进行交互。源码如下:
public interface Session extends Runnable {
int AUTO_ACKNOWLEDGE = 1;
int CLIENT_ACKNOWLEDGE = 2;
int DUPS_OK_ACKNOWLEDGE = 3;
int SESSION_TRANSACTED = 0;
// 其他代码
void run();
// 其他代码
}
JMS消息模型
说完JMS 编程步骤,说下JMS的消息模型。JMS 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布/订阅模型),分别称作:PTP Domain 和Pub/Sub Domain。
PTP(使用Queue即队列目标)
1.消息从一个生产者传送至一个消费者。
2.生产者将消息发送至目标队列,然后根据队列传送策略,从该队列将消息传送至与该队列连接的一个