队列
1.队列的基本知识
- 队列就是存储消息的地方
- 队列默认是非持久化的
2.创建队列时候的参数
队列名字
队列名字
是否持久化
队列默认是非持久化的可以指定为持久化
是否是排他队列
- 如果不是独占的,可以使用两个消费者都访问同一个队列,
- 如果是独占的,会对当前队列加锁,其他通道channel是不能访问的,如果强制访问会报异常,一般等于true的话用于一个队列只能有一个消费者来消费的场景
队列是否自动删除
当最后一个消费者断开连接之后队列是否自动被删除
扩展参数
参数名 | 目的 |
---|---|
x-dead-letter-exchange | 死信交换机 |
x-dead-letter-routing-key | 死信消息的可选路由键 |
x-expires | 队列在指定毫秒数后被删除(x-expires从没有消费者连接开始算起) |
x-ha-policy | 创建HA队列 |
x-ha-nodes | HA队列的分布节点 |
x-max-length | 队列的最大消息数 |
x-message-ttl | 毫秒为单位的消息过期时间,队列级别 |
x-max-length-bytes | 队列的最大容量,单位 Byte |
x-max-priority | 最大优先值为255的队列优先排序功能 |
3.死信交换机
- 用来接收死掉消息的交换机
- 死信交换机是要对某个队列设置的
- 当指定队列出现了消息死亡的情况那么消息会被转发到死信交换机中然后死信交换机根据一定规则再路由。
- 在创建队列的时候使用队列的扩展参数指定
4.延时队列
4.1:为什么需要延时队列
延迟队列存储的对象肯定是对应的延时消息,所谓"延时消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费。
4.2:实现方案有哪几种
- TTL+DLX
- 延时队列插件
4.3:应用场景
- 订单超时关闭
- 锁库存
4.4:TTL+DLX实现的缺点
- 如果是队列级别的消息过期时间, 一旦过期时间要有很多,比如30秒,50秒,40秒后去执行,那么需要创建很多交换机和队列来路由消息
- 如果单独设置消息的TTL,则可能会造成队列中的消息阻塞,比如在队列中有2条消息,第一条过期时间为10秒,第二条消息过期时间为5秒,按理来说应该是第2条消息出队,但是由于第一条消息 还未出队,所以无法投递
4.5:TTL+DLX/消息过期+死信交换机的架构图
- 架构图
4.6:延时队列插件
安装延时插件(如何使用延时插件参考Java整合RabbitMQ哪一篇博客)
- 进入RabbitMQ的插件目录
- 下载插件——wget https://dl.bintray.com/rabbitmq/community-plugins/3.7.x/rabbitmq_delayed_message_exchange/rabbitmq_delayed_message_exchange-20171201-3.7.x.zip
- 使用unzip解压
- 启动插件——rabbitmq-plugins enable rabbitmq_delayed_message_exchange
- 停止插件命令是——rabbitmq-plugins disable rabbitmq_delayed_message_exchange