文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
基本概念
Producer:
消息的生产者,是一个向交换机发布消息的客户端应用程序。
Connection:
生产者/消费者和 RabbitMQ 服务器之间建立的 TCP 连接。
Channel:
TCP 里面的虚拟连接。
- Connection 相当于电缆,Channel 相当于独立光纤束,一条 TCP 连接中可以创建多条信道,增加连接效率。
- 无论是发布消息、接收消息、订阅队列都是通过信道完成的。
为什么使用信道而不直接使用 TCP 连接通信?
- TCP 连接的创建和销毁开销特别大,创建需要 3 次握手,销毁需要 4 次挥手。
- 高峰时每秒成千上万条 TCP 连接的创建会造成资源巨大的浪费。
- 而且操作系统每秒处理 TCP 连接数也是有限制的,会造成性能瓶颈。
- 而如果一条线程使用一条信道,一条 TCP 链接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能的瓶颈。
Broker:
消息队列服务器实体,即 RabbitMQ 服务器。
Virtual Host:
虚拟主机,每个 Virtual Host 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换机、绑定和权限机制。
当多个不同的用户使用同一个 RabbitMQ 服务器时,可以划分出多个虚拟主机。
- RabbitMQ 默认的虚拟主机路径是 /
Exchange:
交换机,用来接收生产者发送的消息,并根据分发规则,将这些消息分发给服务器中的队列中。
不同的交换机有不同的分发规则。
交换机类型有4种:
direct(直连):
- 它会把消息路由到那些
BindingKey RoutingKey
完全匹配的队列中。fanout(扇形):
- 它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
topic(主题):
- 将消息路由到 BindingKey RoutingKey 相匹配的队列中。
headers(标题):
- 交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中 headers 属性进行匹配。
直连交换机(dirext exchange)为 RabbitMQ 默认的交换机。
Queue:
消息队列,用来保存消息直到发送给消费者。
它是消息的容器,也是消息的终点,消息一直在队列里面,等待消费者链接到这个队列将其取走。
Binding:
消息队列和交换机之间的虚拟连接,绑定中包含路由规则,绑定信息保存到交换机的路由表中,作为消息的分发依据。
Consumer:
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
死信队列
当消息在队列中由于某些原因没有被及时消费而变成死信(Dead Message)后,消息中间件可以将其从当前队列发送到另一个队列中,这个队列就是死信队列。
在 RabbitMQ 中,由于有交换机的概念,实际是将死信发送给了死信交换机(Dead Letter Exchange,简称DLX)。
死信交换机 和 死信队列与普通的没有区别。
- 死信队列只是一种特殊的队列,里面的消息仍然可以消费。
消息成为死信的情况:
队列消息长度到达限制
消费者拒签消息,并且不把消息重新放入原队列
消息到达存活时间未被消费
延迟队列
延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。
但 RabbitMQ 中并未提供延迟队列功能,可以使用死信队列实现延迟队列的效果。
- 延迟队列:TTL + 死信队列的合体。