消息三大优势
- 异步处理
- 流量削峰
- 应用解耦
概述
- 消息服务两个重要概念
- 消息代理(message broker)和目的地(destinaton)
当消息发送者发送消息后,由消息代理接管,消息代理保证消息传递到指定目的地
- 消息队列主要两种方式的目的地
- 队列(queue):点对点消息通信
- 主题(queue):发布(publish)/订阅(subscribe)消息通信
两种消息机制
点对点
- 消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后移出队列
- 消息只有唯一的发送者和接收者,但不是说只有一个接收者
发布订阅
- 发送者发送消息到消息主题,多个接收者(订阅者)监听(订阅)这个主题,那么消息就会在消息到达时同时收到消息
两种消息规范
JMS(Java Message Service)java消息服务:
- 基于jvm消息代理的规范。ActiveMQ是JMS实现
AMQP(Advanced Message Queuing Protocol)
- 高级消息队列协议,也是一个消息代理的规范,兼容JMS
- RabbitMQ是AMQP的实现
JMS | AMQP | |
定义 | Java api | 网络线级协议 |
跨平台 | 否 | 是 |
跨语言 | 否 | 是 |
Model | 提供两种消息模型 1. Peer-2-Peer 2. Pub/Sub | 提供五种消息模型: 1. direct exchange 2. fanout exchange topic change 4. headers exchange system exchange 本质来讲,后四种和JMS的pub/sub模型没有太大的区别,知识路由机制划分的更详细 |
支持消息类型 | 多种消息类型 TextMessage MapMessage ByteMessage StreamMessage ObjextMessage Message(只有i消息头和属性) | byte[] 实际应用,复杂消息将消息序列化后发送 |
综合评价 | JMS定义了JAVA API层面的标准,在JAVA体系中,多个client均可以通过JMS交互,不需要吸引改代码,平台的支持较差 | AMQP定义write-level层的协议标准,天然具有跨平台,跨语言特性。 |
spring支持
- spring-jms提供对jms的支持
- spring-rabbit提供对amqp的支持
- 需要ConnectionFactory的实现来连接消息代理
- 提供了JmsTemplate ,RabbitTemplate发送消息
- @JmsListenner(JMS),@RabbitListener(AMQP)注解在方法上监听消息代理发布的消息
- @EnableJms,@EnableRabbit开启支持
springboot
- springboot提供了启动器
- springboot的自动配置
- JmsAutoConfiguration
- RabbitAutoConfiguration
RabbitMQ简介
简介
Rabbit是一个基于erlang语言开发的AMQP的开源实现
核心概念
- Message
消息,消息是不具名的,由消息头和消息体组成,消息是不透明的,而消息头由一些列可选的属性组成,这些属性包括routing-key(路由键),priority(相对于其他消息的优先权),delivery-mode(指出该消息可能需要持久性存储)等 - Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序 - Exchange
交换器,用来接收生产者发送的消息并将这些消息路由到服务器的队列。
Excnage有四种类型:direct(默认),fanout,topic,headers,不同类型的Excnage转发消息的策略有所不同。其中direct可以实现jms点对点模式,其余可以实现订阅模式 - Queue
消息队列,用来保存消息知道发送给消费者。它是消息的容器,也是消息的重点。一个消息可以投入一个或多个队列,消息一直在队列里面,等待消费者连接这个队列将其取走。 - Binding
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,可以将交换器理解成一个由绑定构成的路由表。
Exchange和Queue的绑定可以是多对多的关系。 - Connection
网络连接,比如一个tcp连接。 - Channel
信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真是的TCP连接内的虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息,订阅队列还是接受消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接 - Consumer
消息的消费者,表示一个从消息队列获取消息的客户端程序 - Virtual Host
虚拟主机,表示一批交换器,消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上酒适一个mini的RabbitMQ服务器,拥有自己的队列,减缓其,绑定和权限机制。vhost是AMQP概念的基础,必须在连接时指定,RabbitMQ默认的vhost是/ - Broker
表示消息队列服务器实体
RabbitMQ运行机制
整合RabbitMQ
1 安装RabbitMQ ,使用docker,可以使用镜像中国加速
界面访问 IP:15672 默认登陆用户名密码 guest guest
直接在界面创建交换器队列并绑定
比如创建如下:
- 创建交换器
- 创建队列
- 绑定
点击交换器,进入详细界面,进行绑定 - 界面可以测试 在Exchange选择一个交换器发送消息
- 在Queue可以查看消息
- springboot整合RabbitMQ