浅谈rabbitmq 死信队列与延迟队列
一、死信队列
1、介绍
死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),其实应该叫做死信交换机才更恰当。
当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。
总结:其实死信队列就是一个普通的交换机,有些队列的消息成为死信后,(比如过期了或者队列满了)这些死信一般情况下是会被 RabbitMQ 清理的。但是你可以配置某个交换机为此队列的死信交换机,该队列的消息成为死信后会被重新发送到此 DLX 。至于怎么处理这个DLX中的死信就是看具体的业务场景了,DLX 中的信息可以被路由到新的队列。
2、死信的三种情况
- 队列长度到达限制,无法加入新的消息
- 消费者拒接消费消息,并且不重回队列。该信息会被清除并进入死信队列
- 原队列存在消息过期设置,消息到达超时时间未被消费
3、队列如何绑定DLX(死信交换机)
声明死信交换机(DLX)
@Bean("deadExchange")
public Exchange deadExchange(){
return ExchangeBuilder.topicExchange("sb_dead_exchange").durable(true)
.autoDelete().build();
}
声明普通队列A,绑定DLX
@Bean
public Queue queueA(){
Queue build = QueueBuilder.durable("sb_dead_queue_a").build();
build.addArgument("x-message-ttl",10000);
build.addArgument("x-dead-letter-exchange","sb_dead_exchange");
// 此时队列相当于生产者,因此要指定消息的routing key,死信队列可以更加routing key路由到其他队列
build.addArgument("x-dead-letter-routing-key","user4.info");
return build;
}
// 绑定此队列和它的交换机
@Bean("topicExchange")
public Exchange topicExchange(){
return ExchangeBuilder.topicExchange("sb_topic_exchange").durable(true)
.autoDelete().build();
}
@Bean
public Binding exchangQueueA(@Qualifier("queueA")Queue queue,
@Qualifier("topicExchange") Exchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("user3.#").noargs();
}
二、延迟队列
因为消息过期后,就变为死信。随之会发送到死信交换机(DLX), 这时通过queueB 队列绑定 DLX ,queueB 队列就可以实现延迟队列功能了。
声明普通队列B,绑定DLX
@Bean
public Queue queueB(){
Queue build = QueueBuilder.durable("sb_dead_queue_b").build();
return build;
}
@Bean
public Binding exchangQueue4(@Qualifier("queueB")Queue queue,
@Qualifier("deadExchange") Exchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("user4.#").noargs();
}
linhuaming