52.什么是死信队列?
DLX,Dead-Letter-Exchange。利用 DLX ,当消息在一个队列中变成死信(dead message)之后,它能被重新 publish 到另一个 Exchange ,这个 Exchange 就是DLX。消息变成死信一向有一下几种情况:
- 消息被拒绝(basic.reject / basic.nack)并且
requeue=false
。 - 消息 TTL 过期(参考:RabbitMQ之TTL(Time-To-Live 过期时间))。
- 队列达到最大长度。
详细的,可以看看 《RabbitMQ 之死信队列》 文章。
? “dead letter”queue 的用途?
当消息被 RabbitMQ server 投递到 consumer 后,但 consumer 却通过 Basic.Reject
进行了拒绝时(同时设置 requeue=false
),那么该消息会被放入 “dead letter” queue 中。该 queue 可用于排查 message 被 reject 或 undeliver 的原因。
? Basic.Reject
的用法是什么?
该信令可用于 consumer 对收到的 message 进行 reject 。
- 若在该信令中设置
requeue=true
,则当 RabbitMQ server 收到该拒绝信令后,会将该 message 重新发送到下一个处于 consume 状态的 consumer 处(理论上仍可能将该消息发送给当前 consumer)。 - 若设置
requeue=false
,则 RabbitMQ server 在收到拒绝信令后,将直接将该 message 从 queue 中移除。
另外一种移除 queue 中 message 的小技巧是,consumer 回复 Basic.Ack
但不对获取到的 message 做任何处理。而 Basic.Nack
是对 Basic.Reject 的扩展,以支持一次拒绝多条 message 的能力。