死信队列
死信队列(Dead Letter Queue,简称 DLQ)是一种特殊的队列,用于接收其他队列中的死信(Dead Letter)消息。 死信消息通常是指无法被消费者成功处理的消息,导致该消息无法被正确消费并从原始队列中移除的情况。
通常以下情况会导致消息成为死信消息:
- 消息被拒绝:消费者拒绝处理消息,并且设置了
requeue=false
,导致消息不会重新回到原始队列,从而成为死信消息。 - 消息过期:如果消息设置了过期时间,当消息在队列中等待超过其过期时间时,会成为死信消息。
- 队列达到最大长度:如果队列设置了最大长度限制,并且队列已满,新的消息将被丢弃或成为死信消息。
以 Python 为例
声明普通队列,并设置死信队列参数
channel.queue_declare(
queue='my_queue',
arguments={
'x-dead-letter-exchange': '',
'x-dead-letter-routing-key': 'dead_letters',
}
)
在上述代码中,我们声明了一个名为 my_queue 的普通队列,并设置了两个参数:
- x-dead-letter-exchange:指定死信队列的交换机
- x-dead-letter-routing-key:指定死信队列的路由键
声明死信队列
channel.queue_declare(queue='dead_letters')
接着,我们声明了名为 dead_letters 的死信队列。至此,我们就完成了死信队列的配置。
当我们往 my_queue 推送一条消息数据并指定5s的过期时间,等5s之后,我们就可以看到这条消息进入到了死信队列。
channel.basic_publish(
exchange='',
routing_key='my_queue',
body='test',
properties=pika.BasicProperties(expiration=5000),
)
现在回过头来整理,我们会发现所谓的死信队列其实就是一种比较特殊的队列。 我们甚至可以直接把死信队列当普通队列来使用。但需要注意的是,死信队列会自动接受死信消息。 所以通常情况下,一般不主动往里面推送数据。