概述
1、在大多应用中,可通过消息中间件来提升消息异步通信、扩展解耦能力
场景:流量削峰、解耦应用,,,
2、消息服务中两个概念:消息代理(message broker)和目的地(destination)
当消息发送者发送消息以后,由消息代理接管,消息代理保证消息传递到指定目的地。
3、消息队列有两种形式的目的地
- 队列(queue):点对点消息通信(point-to-point)
消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息的内容,消息读取后被移出队列;且消息只有唯一的发送者和接受者,但并不是说只能有一个接收者 - 主题(topic):发布(publish)-订阅(subscribe)消息通信
发送者发送消息到主题,多个接收者监听这个主题,那么就会在消息到达的同时收到消息
4、消息服务的规范
- JMS(Java Message Service)Java消息服务:基于JVM消息代理的规范,ActiveMQ、HornetMQ是JMS实现
- AMQP(Advanced Message Queuing Protocol):消息高级队列协议,也是一个消息代理的规范,兼容JMS,RabbitMQ是AMQP的实现
RabbitMQ
- RabbitMQ是一个AMQP的开源实现,主要的核心概念如下:
- Message:消息,消息是不具名的,由消息头和消息体组成;消息体是不透明的,消息头是由一系列的可选属性组成的,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先级)、delivery-mode(指出该消息可能需要永久性存储)
- Publisher:消息的生产者,也是一个向交换器发送消息的客户端应用
- Exchange:交换器,用来接收生产者发送的消息并将消息路由给服务器中的队列;Exchange有四种类型:direct(默认的,可以进行点对点的传输),fanout、topic、headers,不同类型的exchange转发消息的策略有所区别
- Queue:消息队列,用来保存消息,也是消息的终点。消息会一直在队列里直到消费者链接到这个队列将消息取走;交换器根据消息的路由键将消息路由到对应的消息队列,Exchange和Queue是多对多的关系
- Binding:绑定,用于消息队列和Exchange之间的关联;一个绑定就是路由键将交换器和队列连接起来的路由规则,所以交换器可以理解为一个由绑定规则构建的路由表
- Connection:网络链接,如一个TCP连接
- Channel:信道,一条独立的双向数据流通道,是建立在TCP连接内的虚拟连接,AMQP的消息都是通过信息发送,因为对于操作系统来说建立销毁一条TCP连接都需要消耗资源,所以引入信道,以复用一条TCP连接
- Consumer:消息消费者,一个从消息队列中取得消息的客户端应用
- Virtual Host:虚拟主机,表示一批交换器、消息队列和相关对象;虚拟主机是共享身份认证和加密环境的服务器域;每个虚拟主机都是一个mini版的RabbitMQ的服务器,拥有自己的 交换器、队列、绑定、权限机制。虚拟主机是AMQP的基础,必须在连接时指定,默认的是 “/”
- Broker:消息队列服务器实体