浅谈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();
}
posted @ 2024-08-08 16:30  吴川华仔  阅读(56)  评论(0编辑  收藏  举报