RabbitMQ 死信队列 定时队列 延时队列

2019-11-12  本文已影响0人  風暴之灵

死信队列(DLX) 

Dead-Letter-Exchange 

利用DLX, 当消息在一个队列中变成死信(dead message)之后, 它能被重新publish到另一个Exchange, 这个Exchange就是DLX 

DLX也是一个正常的Exchange, 和一般的Exchange没有区别, 它能在任何队列上被指定, 实际上就是设置某个队列的属性为死信队列 

当这个队列中有死信时, RabbitMQ就会自动将这个消息重新发布到设置的Exchange上去, 进而被路由到另一个队列 可以监听这个队列中消息做相应的处理, 这个特性可以弥补RabbitMQ3.0以前支持的immediate参数的功能 

消息进入死信队列的三种情况:

消息被拒绝 (basic.reject or basic.nack) 且带 requeue=false 参数

消息的TTL-存活时间已经过期

队列长度限制被超越(队列满)

死信队列的设置

首先要设置死信队列的exchange和queue, 然后进行绑定

    1. Exchange : dlx.exchange 

    2. Queue : dlx.queue

    3. RoutingKey : #

然后正常声明交换机, 队列, 绑定, 只不过需要在队列加上一个扩展参数即可 : arguments.put(“x-dead-letter-exchange”, “dlx.exchange”);

死信队列解决的问题:

1. 列信息因消费不及时大量积压,消费方服务先处理不及时会影响到队列的生产者,进而会影响到所有消费此topic的队列

2. 队列的消息超时后消失,生产者和消费者完全无感知,只能靠查落地存储的历史记录,很不方便同时业务无法再消费处理

延时队列实现方式:

增加延时队列,通过dead-letter方式实现超过有效期后进入可以被消费的队列中,让消费者处理

定时队列实现方式:

计算倒计时,再放入延时队列让消费者处理

消息总线实现:

可接受队列,延时等待队列,死信队列分别加上特定的前缀

然后通过元注解参数来区分生产者发送的队列类型

在注解监听器监听参数,如果是延时队列发送给延时等待队列,普通队列发送给可接受队列

所有消费者统一消费可接受队列

上一篇下一篇

猜你喜欢

热点阅读