rabbitnq 之 死信交换机DLX & 死信队列DLQ

1  先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理 解,一般来说,producer 将消息投递到 broker 或者直接到queue 里了,consumer 从 queue 取出消息 进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有 后续的处理,就变成了死信,有死信自然就有了死信队列。  

2  当消息在一个队列中变成死信后,它能被重新publish到另一个Exchange,这个Exchange就是死信交换机DLX。消息变成死信一向有以下几种情况:

  • 消息被拒绝(basic.reject or basic.nack)并且requeue=false
  • 消息TTL过期
  • 队列达到最大长度

 

3  声明死信交换机

//正常队列绑定死信队列信息
Map<String, Object> params = new HashMap<>();
//正常队列设置死信交换机 参数 key 是固定值
params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
//正常队列设置死信 routing-key 参数 key 是固定值
params.put("x-dead-letter-routing-key", "lisi");
String normalQueue = "normal-queue";
channel.queueDeclare(normalQueue, false, false, false, params);

4  死信交换机 和 备份交换机的区别

  什么是备份交换机呢?备份交换机可以理解为 RabbitMQ 中交换机的“备胎”,当我们为某一个交换机声明一个对应的备份交换机时,就是为它创建一个备胎,当交换机接收到一条不可路由消息时,将会把这条消息转发到备份交换机中,由备份交换机来进行转发和处理,通常备份交换机的类型为 Fanout ,这样就能把所有消息都投递到与其绑定 的队列中,然后我们在备份交换机下绑定一个队列,这样所有那些原交换机无法被路由的消息,就会都进 入这个队列了。当然,我们还可以建立一个报警队列,用独立的消费者来进行监测和报警。
  在上文中我们知道进入死信交换机有三种情况  (1 消息被拒绝(basic.reject or basic.nack)并且requeue=false  ; 2  消息TTL过期 ; 3  队列达到最大长度 ) ; 进入备份交换机的情况是:: 一个消息进入交换机后 , 无法被路由到指定的队列 ( 一般是队列不存在 ) , 这个时候可以转发到备份交换机. 

  总的来说 ,消息根本没有机会进入到队列 , 则会进入备份交换机 ( 如果配置了的话 )  ;  消息进入队列 ,满足死信的三个条件 , 则进入死信队列 (  如果配置了的话 )

  声明死信交换机 的时候设置 x-dead-letter-exchange参数 , 申明备份交换机的时候设置 alternate-exchange 参数

 

备份交换机示例: 

 

posted @ 2021-11-18 15:09  代达罗斯之殇  阅读(310)  评论(0编辑  收藏  举报