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 的能力。