死信交换机
满足下列情况一点,即为死信(dead letter):
- 消费者使用 basic.reject 或 basic.nack 声明消费失败,并且消息的 requeue 参数设置为 false。
- 消息是一个过期消息,超时无人消费。
- 要投递的队列满了,最早的消息可能成为死信。
如果该队列配置了 dead-letter-exchange 属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,这个交换机就叫 死信交换机(DLX)。
死信交换机与前文的异常交换机的区别:死信交换机是 Queue 发送消息,而异常交换机是 consumer 发送消息。
给队列绑定死信交换机:
- 给队列设置 dead-letter-exchange 属性,指定一个交换机。
- 给队列设置 dead-letter-routing-key 属性,设置死信交换机与死信队列的 RoutingKey。
延迟队列
如果一个队列中的消息 TTL 结束仍未消费,则会变成死信,ttl 超时分为两种情况:
- 消息所在队列设置了存活时间。
- 消息本身设置了存活时间。
- 当队列和消息都有存活时间时,按照最小存活时间生效。
延迟队列:
利用 TTL 结合死信交换机,实现发送消息后,消费者延迟收到消息的效果。这种消息模式就称为延迟队列(Delay Queue)模式。
延迟队列的使用场景:
- 延迟发送信息。
- 用户下单,如果用户限定时间内未支付,自动取消。
TTL 结合死信交换机完成延迟队列功能:
延迟队列创建:
@Bean
public DirectExchange ttlDirectExchange(){
return