消息生产者并不与队列产生交互,他所产生的消息全部会投递给交换机,然后交换机根据路由规则再将消息投递到不同的队列中。而后,消费者才可以在队列中读取消息。
1. 交换机
1.1. 交换机类型
1.1.1. fanout
fanout类型的交换机会把所有发送到该交换机的消息路由到所有与该交换机绑定的队列
1.1.2. direct
direct类型的交换机会把消息路由到BindingKey和RoutingKey完全相同的队列中
1.1.3. topic
topic类型的交换机使用的BindingKey是带有通配符的,其实就相当于sql
中的like
由于使用了通配符,所以他有三个比较重要的符号 .
*
#
.
因为这儿的通配符都是以单词为单位而不是字母为单位的,所以引入了.
来分隔不同的单词*
匹配一个单词#
匹配0个到多个单词
1.1.4. headers
headers类型的交换机不依赖路由键来进行匹配,而是根据header里的键值对,如果键值对完全相同才会把消息路由到队列中
1.2. durable 交换机持久化
通过设置durable可以来让交换机持久化,这样交换机的信息就会持久化到硬盘,这样服务器重启的时候,交换机信息不会丢失
1.3. autoDelete 自动删除
自动删除设置,自动删除的触发条件是 有客户端连接到该交换机 然后所有跟该交换机绑定的交换机和队列全部解绑。而不是所有连接的客户端断开。
1.4. internal 内置
内置交换机,客户端无法连接到该交换机,但是客户可以通过别的交换机路由到该交换机
1.5. alternate-exchange 备份交换机
这是建立交换机的额外参数,参数值应为一个交换机名称,通过该参数可以为当前交换机建立一个备份交换机
2. 队列
2.1. durable 持久化
通过设置durable可以来让队列持久化,这样队列的信息就会持久化到硬盘,这样服务器重启的时候,队列信息不会丢失
2.2. autoDelete 自动删除
至少有一个客户端连接到该队列之后,所有连接到该队列的客户端全部断开后自动删除
2.3. TTL 队列过期设置
通关参数x-message-ttl可以为队列里的消息设置过期时间(毫秒),队列里的所有消息拥有相同的过期时间
2.4. 排他队列
只有在声明的时候通过指定exclusive参数来创建
如果设置为排他那么该队列仅对声明他的连接及该连接下的所有Channel可见,并在该连接断开时自动删除
2.5 死信队列 DLX
通过设置参数 x-dead-letter-exchange 来进行设置,值应该是一个队列的名字。
死信队列也是一种普通的队列,只是因为作用的问题被称为死信队列。
可以通过参数 x-dead-letter-routing-key 来为死信队列单独设置路由key,如果没有指定,那么将使用原队列的路由key
那么什么消息会进入死信队列呢
- 消息被拒绝,且requeue参数为false
- 消息过期
- 队列达到最大长度
2.6 延迟队列
RabbitMQ本身不支持延迟队列,但是可以通过设置过期时间和死信队列来实现
生产者往带有过期时间的队列中发送数据,消费者在死信队列中获取消息进行处理
这样只有消息达到过期时间才会进入死信队列,消费者才能进行消费
2.7 优先级队列
通过设置参数 x-max-priority 来进行设置,该值为一个数字
优先级仅在消费速度跟不上生产速度,产生了数据堆积的情况下有效,不然生产一条消费一条也就没有优先级的概念
如果设置的消息的优先级超过最大优先级 那么会按照最大优先级处理
举个栗子,最大优先级为10 但是我们推送了部分优先级 11 12 13 14 的数据,那么 11 12 13 14会都按照10处理,他们会优先处理 但是可能是12优先于14
如果消息优先级小于0 那么也会采用相同的操作
3. 绑定
3.1 交换机和队列绑定
绑就完了
3.2 交换机和交换机绑定
绑就完了