RabbitMQ是采用Erland语言实现AMQP(Advance Message Queuing Protrol,高级消息队列)的消息中间件。RabbitMQ是一个生产者和消费者模型,主要负责接收,存储和转发消息。传递过程类似于你将一个包裹送到邮局,邮局会暂存并最终将邮件通过快递员送到接受人的手上,RabbitMQ就类似于邮局、邮箱、邮递员组成的一个系统。
1.消息中间件是什么
消息:应用之间传送的数据(文本/json等)
消息中间件:message queue Middleware简称MQ。指利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式的集成。通过提供消息传递和消息排队模型。实现进程间的通信
消息队列中间:可称为消息队列或者消息中间件,传递方式分为两种点对点(P2P,Point-to-Potint)模式和发布订阅(Pub/Sub)模式
P2P:
- 点对点模式基于队列
- 发送者发送消息到队列,消费者从队列中接收消息
- 可以异步传输
Pub/Sub:
- 定义内容节点发布和订阅消息,这个内容节点称为主题,主题可以看作消息传递的中介,
- 发布者将消息发送到主题,订阅者从主题中订阅消息,从而使订阅和发布相互独立,用于一对多广播
2.作用
- 解耦
- 冗余(存储)
- 扩展
- 消峰
- 可恢复性
- 顺序
- 缓存
- 异步
2.生产者、消费者、Broker
生产者:producer,即投递消息的一方,生成着创建消息,然后发布到RabbitMQ中,一般包含两部分:消息体(Payload)和标签(Label)
消息体:一般就是带有业务逻辑的数据比如json
标签:设置的路由规则,将消息发送给RabbitMQ后,RabbitMQ会根据标签发送给对应的消费者,在消息存入队列中时,消息的标签会丢失,存到队列中的只有消息体
消费者:consumer,接收消息的一方。消费者连接到RabbitMQ服务器上并订阅到队列上。
队列:queue,RabbitMQ中的对象,用于存储消息,且RabbitMQ的消息只能存储到队列中
消息中间件的服务节点:Broker。RabbitMQ的一个服务节点或者RabbitMQ服务实例。
- 发送消费流程:
具体流程:
生产者
1.连接RabbitMQ Broker,建立一个连接,开启通道
2.生产者交换器和队列并设置相关属性
3.将交换器和队列进行绑定
4.生产者发送消息给RabbitMQ Broker
5.交换器根据路由查找相对应的队列
6.找到则存入队列,没有找到根据生产者的配置属性选择丢弃还是会退给生产者
7.关闭信道
8.关闭连接
消费者
1.连接到RabbitMQ,建议一个连接和信道
2.发送请求消费相对应的队列中的消息
3.等待Broker的回应,接收消息
4.消费者确认接收到消息
5.RabbitMQ从队列中删除相应的确认消息
6.关闭信道
7.关闭连接
交换器,路由键、绑定
交换器:RabbitMQ中的实体,生产者先把消息传输给交换器,由交换器把消息发送给一个或者多个队列。交换器类型分为四种:
1.fanout,交换器将消息发送给与交换器绑定的队列和其他交换器
2.direct:交换器完全按照路由规则进行匹配发送给相对应的队列或交换器
3.topic:direct的升级,进行模糊匹配
4.header:不依赖于交换器和队列几乎不使用该类型
路由键
RoutingKey:路由键,生产者发送消息到交换器一般指定RoutingKey,用户消息的路由,而这个RoutingKey需要与交换器和绑定键(Bindingkey)联合使用有效。联合使用即路由规则,决定消息流向哪里
Binding:绑定,将交换器和队列管理起来,在绑定的时候一般会指定一个绑定键(Bindingkey)
Connection/Channel
与RabbitMQ Broker建立连接,实则建立了一条TCP连接,也就是Connection,连接建立好了,就可以创建AMQP信道(Channel),每个信道都会被指派一个唯一的ID,信道建立在Connection上的虚拟连接,RabbitMQ处理的每条AMQP指定都是通过信道完成的。
引入信道的原因:创建一个TCP连接开启昂贵,在使用高峰时出现性能瓶颈,随即RabbitMQ采用NIO(Non-Blocking I/0)的做法,选择TCP连接复用,这样不仅减少开销,也方便管理。由于信道是非现场安全的,所有每个线程都应把持一个唯一的信道,从而复用Connection的TCP连接