消息的拒绝
Reject 和 Nack
消息确认可以让 RabbitMQ知道消费者已经接受并处理完消息。但是如果消息本身或者消息的处理过程出现问题怎么办?需要一种机制,通知RabbitMQ,这个消息,我无法处理,请让别的消费者处理。这里就有两种机制,Reject和 Nack。
Reject在拒绝消息时,可以使用 requeue标识,告诉 RabbitMQ 是否需要重新发送给别的消费者。不重新发送,一般这个消息就会被 RabbitMQ丢弃。Reject一次只能拒绝一条消息。
Nack则可以一次性拒绝多个消息。这是 RabbitMQ对 AMQP规范的一个扩展。
通过 RejectRequeuConsumer可以看到当 requeue参数设置为 true时,消息发生了重新投递。
死信交换器 DLX
RabbitMQ对 AMQP规范的一个扩展。被投递消息被拒绝后的一个可选行为,往往用在对问题消息的诊断上。
消息变成死信一般是以下几种情况:
- ·消息被拒绝,并且设置 requeue 参数为 false
- ·消息过期
- ·队列达到最大长度
死信交换器仍然只是一个普通的交换器,创建时并没有特别要求和操作。在创建队列的时候,声明该交换器将用作保存被拒绝的消息即可,相关的参数是 x-dead-letter-exchange。
和备用交换器的区别
1、备用交换器是主交换器无法路由消息,那么消息将被路由到这个新的备用交换器,而死信交换器则是接收过期或者被拒绝的消息。
2、备用交换器是在声明主交换器时发生联系,而死信交换器则声明队列时发生联系。