没有合适的资源?快使用搜索试试~ 我知道了~
RabbitMQ死信队列应用1
需积分: 0 8 下载量 46 浏览量
2022-08-03
15:14:06
上传
评论 1
收藏 561KB PDF 举报
温馨提示
试读
12页
1、什么是死信队列 2、死信队列应用场景 3、延迟消息概念 4、死信队列使用流程图 5、死信队列应用(管理控制台) 6、死信队列应用(Java代码)
资源推荐
资源详情
资源评论
RabbitMQ死信队列应用
1、什么是死信队列
DLX, Dead-Letter-Exchange。利用DLX, 当消息在一个队列中因为业务队列处理失败(比如抛异常
并且达到了retry的上限)变成死信(dead message)之后,它能被重新publish到另一个Exchange,这
个Exchange就是DLX。消息变成死信一般有一下几种情况:
PS:消息被拒绝:
consumer端,当消费者要过滤某些消息的时候,那部分被过滤掉的消息如果不设置退回,消
息重回队列的话,这些消息就变成了死信,即在下面的代码中第三个参数设置成false即可
DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际
上就是设置某个队列的属性,当这个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设
置的Exchange上去,进而被路由到另一个队列,可以监听这个队列中消息做相应的处理,这个特性可
以弥补RabbitMQ 3.0以前支持的immediate参数(可以参考RabbitMQ之mandatory和immediate)的
功能。
注意应用场景:重要的业务队列如果失败,就需要重新将消息用另一种业务逻辑处理;如果是正常的业
务逻辑故意让消息中不合法的值失败,就不需要死信;具体场景具体分析
2、死信队列应用场景
最经典的应用场景:超时未支付订单处理
需求分析:
超过60分钟未支付的订单,我们需要进行超时订单的处理:先调用微信支付api,查询该订单
的支付状态。如果未支付调用关闭 订单的api,并修改订单状态为已关闭,并回滚库存数。如果该订
单已经支付,做补偿操作(修改订单状态和记录)。
实现思路 :
如何获取超过60分钟的订单?我们目前有两种实现方案
(1)定时任务轮询方案
编写定时任务,查询所有60分钟前创建的订单列表。 循环此订单列表,查询每个订单的支
付状态。如果已支付进行状态补偿,如果未支付则 关闭订单。
这种实现方案缺点是时间精度不高,对系统压力比较大。 (为什么时间精度不高?因为时
间短交叉了)
(2)使用延迟消息队列
1)消息被拒绝(basic.reject/ basic.nack)并且requeue=false;
2)消费消息时程序出现了异常;
3)消息过期(x-message-ttl);
4)队列中有消息数量超过了最大值(x-max-length);
5)队列中的消息容量超过了队列的最大空间(x-max-length-bytes);
channel.basicNack(envelope.getDeliveryTag(),false,false);
所谓延迟消息队列,就是消息的生产者发送的消息并不会立刻被消费,而是在设定的时间之
后才可以消费。
我们可以在订单创建时发送一个延迟消息,消息为订单号,系统会在60分钟后取出这个消息,
然后查询订单的支付状态,根据结果做出相应的处理。
3、延迟消息概念
3.1 消息的TTL(Time To Live)
消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队
列每个消息的保留时间,也可以对每一个单独的消息做单独的设置。如果同时使用这2种方法,那么以
过期时间小的那个数值为准!超过 了这个时间,我们认为这个消息就死了,称之为死信。 我们创建一
个队列queue.temp,在Arguments 中添加x-message-ttl 为5000 (单位是 毫秒),那所在这个队列
的消息在5秒后会消失。
3.2 死信交换器
死信交换器 Dead Letter Exchanges
一个消息在满足如下条件下,会进死信路由,记住这里是路由而不是队列,一个路由可以对应很多队
列。
(1) 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再
次放在队列里,被其他消费者使用。
(2)上面的消息的TTL到了,消息过期了。
(3)队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上。
Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没有两 样。只是在某一个
设置Dead Letter Exchange的队列中有消息过期了,会自动触发消息的转发,发送到Dead Letter
Exchange中去。
3.3 延时队列
在rabbitmq中不存在延时队列,但是我们可以通过设置消息的过期时间和死信队列来模拟出延时队
列。消费者监听死信交换器绑定的队列,而不要监听消息发送的队列。
4、死信队列使用流程图
我们以订单支付作为例子来画图理解:服务器产生订单,通过订单交换机和routing key将订单消息发
送到死信队列
5、死信队列应用(管理控制台)
需要创建四个角色:
order_exchange:订单交换机
order_queue:订单队列
dlx.exchange:死信交换机
dlx.queue:死信队列(存放无法消费的消息)
绑定关系:
order_exchange和order_queue通过order.#路由key绑定;
dlx.exchange和dlx.queue通过#路由key绑定
唯一的区别在于order_queue的创建:
设置消息过期参数 x-message-ttl:10000(10秒);
设置死信交换机 x-dead-letter-exchange:dlx.exchange
剩余11页未读,继续阅读
资源评论
陈后主
- 粉丝: 30
- 资源: 341
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功