消息队列之JMS&AMQP简介与对比
(一)JMS简介
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
体系架构
JMS元素 | 说明 |
---|---|
JMS提供者 | 连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。 |
JMS客户 | 生产或消费基于消息的Java的应用程序或对象。 |
JMS生产者 | 创建并发送消息的JMS客户。 |
JMS消费者 | 接收消息的JMS客户。 |
JMS消息 | 包括可以在JMS客户之间传递的数据的对象 |
JMS队列 | 一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。一旦一个消息被阅读,该消息将被从队列中移走。 |
JMS主题 | 一种支持发送消息给多个订阅者的机制。 |
消息类型
- 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。
- 发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。
(二)AMQP简介
高级消息队列协议,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有 RabbitMQ等。
主要功能
模块 | 说明 |
---|---|
exchange | 接收发布应用程序发送的消息,并根据一定的规则将这些消息路由到“消息队列。 |
message queue | 存储消息,直到这些消息被消费者安全处理完为止。 |
binding | 定义了exchange和message queue之间的关联,提供路由规则。 |
消息类型
- 存储转发:多个消息发送者,单个消息接收者。
- 分布式事务:多个消息发送者,多个消息接收者。
- 发布订阅:多个消息发送者,多个消息接收者。
- 基于内容的路由:多个消息发送者,多个消息接收者。
- 文件传输队列:多个消息发送者,多个消息接收者。
- 点对点连接:单个消息发送者,单个消息接收者。
(三)JMS与AMQP的区别
JMS | AMQP | |
---|---|---|
定义 | java API | 网络线级协议 |
跨平台 | 否 | 是 |
跨语言 | 否 | 是 |
Model | 1.peer-2-Peer 2.pub / sub |
1.direct exchange 2.fnout exchange 3.topic change 4.headers exchange 5.system exchange 后四种都是pub/sub ,差别路由机制做了更详细的划分 |
支持消息类型 | TextMessage MapMessage ByteMessage StreamMessage ObjectMessage Message |
byte[ ] 当实际应用时,有复杂的消息,可以将消息序列化后发送 |
综合评价 | JMS定义了java api层面的标准,在java体系中,多个client均可通过JMS进行交互,不需要应用修啊给i代码,但是其跨平台的支持较差。 | AMQP定义了wire-level层的协议标准,天然具有跨平台,跨语言的特性 |
(四)SpringBoot的支持
-
spring-jms提供了对JMS的支持
-
spring-rabbit提供了对AMQP的支持(具体可见官网文档)
-
需要创建ConnectionFactory的实现来连接消息代理
-
提供JmsTemplate,RabbitTemplate来发送消息
-
@JmsListener(JMS)[email protected](AMQP)注解在方法上的监听消息代理发布的消息
-
@EnableJms,@EnableRabbit开启支持
-
SpringBoot的自动配置
1)JmsAutoConfiguration
2)RabbitAutoConfiguration
(五)消息队列实列
异步处理 | 同步方机制 |
|
并发机制 |
|
|
消息队列机制 |
|
应用解耦 | 耦合应用 | |
解耦应用 |
|
流量削峰 |