RabbitMQ之死信队列
rabbitMq没有提供延时队列的方法,我们可以利用TTL和DLX来实现延时队列功能。
死信队列
DLX(Dead-Letter-Exchange),利用DLX,当消息在一个队列中变成死信 (dead message)
之后,能被重新发布到另一个交换机(Exchange),这个交换机就是DLX。
消息变成死信的几种情况
- 消息被拒绝(basic.reject/ basic.nack)并且不再重新投递 requeue=false
- 消息TTL过期
- 队列达到最大长度(队列满了,无法再添加数据到mq中)
方法:
DLX能在任何的队列上被指定,设置某个队列(延迟死信队列)的属性,当这个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进而被路由到另一个队列(实际消费的队列),可以监听实际消费队列中消息做相应的处理。
延迟死信队列属性设置:
x-dead-letter-exchange
:设置变成死信队列后发送的交换机。
x-dead-letter-routing-key
:死信路由键,死信重新按照指定的routing-key发送
x-message-ttl
:设置当前队列中所有消息的过期时间,针对单个消息来说,在发布消息时,可以使用Expiration参数来设置单个消息的过期时间(ms)
x-max-length
:设置队列的最大长度