type
status
date
slug
summary
tags
category
icon
password
死信队列是指当一条消息在队列中出现以下三种情况的时候,该消息就会变成一条死信。
- 消息被拒绝(basic.reject / basic.nack),并且requeue = false
- 消息TTL过期
- 队列达到最大长度

image-20230616172332204
逻辑
一个生产者,两个消费者,一个是正常消费者,一个是死信消费者。正常消费者声明一个正常交换机,一个死信交换机,声明一个正常队列和死信队列,交换机和队列绑定,正常队列再和死信队列绑定,当消息达到死信条件的时候讲消息发送给死信交换机,发送到死信消费者进行处理。

生产者
发送消息,设置消息过期时间为 10 秒
测试
先启动消费者,初始化交换机和队列。然后把消费者程序停掉,再启动生产者。生产者发送 10条消息,因为没有消费者接受,所以可以在后台看到消息,会被转到死信队列中。
下图可以看到正常队列中有 10 条消息,10秒过后因为没有被消费,所以移动到了死信队列中。


死信消息消费者
现在消息在死信队列中等待被消费,写一个消费者进行消费即可
结果

队列达到最大长度导致死信
前面说过导致消息进入死信队列有三中情况,这次演示当队列达到最大长度导致的死信。
在创建队列的时候可以设置队列最大长度
重新创建队列,并且指定队列最大长度。


重新发送10条消息,正常就是死信4条,正常队列 6 条

image-20230617172259718
消息被拒绝导致死信
可以看到拒绝了一条消息,放入死信队列了,并且这条消息是 info5

