分布式中的消息中间件
一. 引入
1. 异步处理
2.应用解耦
3.流量控制
二. 概述
-
大多数应用中,可通过消息服务中间件来提升系统异步通信,扩展解耦能力
-
消息服务中两个重要概念: 消息代理(message broker)和目的地(destination),当消息发送者发送消息后,将由消息代理接管,消息代理保证消息传递到指定
-
消息队列主要有两种形式的目的地
- 队列(queue) : 点对点消息通信(point to point)
- 主题(topic) : 发布(publish)/订阅(subscribe) 消息通信
-
点对点式:
- 消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列
- 消息只有唯一的发送者和接收者,但并不是说只能有一个接收者(可以有多个接收者,但是消息最终只会被一个接收者接收)
-
发布订阅式:
- 发送者(发布者) 发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,所有在消息到达前订阅的订阅者都能收到消息
-
JMS(Java Message Service) Java消息服务:
- 基于JVM消息代理的规范,ActiveMQ,HornetMQ是JMS实现的
-
AMQP(Advanced Message Queuing Protocol):
- 高级消息队列协议, 也是一个消息代理的规范,兼容JMS
- RabbitMQ是AMQP的实现
-
JMS(Java Message Service) AMQP(Advanced Message Queuing Protocol) 定义 Java api 网络线级协议 跨语言 否 是 垮平台 否 是 Model 提供两种消息模型:
(1).Peer-2-Peer
(2).Pub/Sub提供五种消息模型:
(1).direct exchange
(2).fanout exchange
(3).topic change
(4).headers exchange
(5).system exchange
本质来讲,后四种和JMS的pub/sub模型没什么太大区别,仅是在路由机制上做了更详细的划分支持消息类型 多种消息类型:
TextMessage
MapMessage
BytesMessage
StreamMessage
ObjectMessage
Message(只有消息头和属性)byte[]
当实际应用时,有复杂的消息,可以将消息序列化后发送综合评价 JMS定义了JAVA API层面的标准,在JAVA体系中,多个Client均可以通过JMS进行交互,
不需要应用修改代码,但是其对跨平台的支持较差AMQP定义了wire-level层的协议标准,天然具有跨平台,跨语言特性 -
spring支持
- spring-jms提供对JMS的支持
- spring-rabbit提供对AMQP的支持
- 需要ConnectionFactory的实现来连接消息代理
- 提供JmsTemplate,RabbitTemplate来发送消息
- @JmsListener(JMS),@RabbitListener(AMQP)注解在方法上监听消息代理发布消息
- @EnableJms,@EnableRabbit开启支持
-
springboot自动配置
- JmsAutoConfiguration
- RabbitAutoConfiguration
-
MQ产品
- ActiveMQ,RabbitMQ,RocketMQ,Kafka