首页 > 其他分享 >浅谈rabbitmq 死信队列与延迟队列

浅谈rabbitmq 死信队列与延迟队列

时间:2024-08-08 16:39:49浏览次数:8  
标签:浅谈 exchange 队列 死信 交换机 build DLX

目录

一、死信队列

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();
}

标签:浅谈,exchange,队列,死信,交换机,build,DLX
From: https://www.cnblogs.com/linhuaming/p/18349199

相关文章

  • 队列(Queue)
    1、基本概念        队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。       ......
  • 阻塞队列(java)
    阻塞队列(BlockingQueue)是一个线程安全的队列,支持阻塞的插入和移除操作。它常用于生产者-消费者问题等多线程环境中。以下是一个简单的Java实现,展示了如何使用 BlockingQueue 来实现一个基本的阻塞队列示例importjava.util.concurrent.ArrayBlockingQueue;importjava.......
  • 浅谈AEB的安全设计与技术进化
    浅谈AEB的安全设计与技术进化一、AEB的功能安全需求从HARA角度进行AEB的功能安全分析,可以得出共识性最高的2个安全目标内容描述:非预期的制动过大和非预期的不可释放制动。随着下一步安全目标内容的分解,可以得出:1. 非预期的制动过大(含误触发)的争论点:包括了非预期的AEB触......
  • 【数据结构与算法】删除循环队列中第k个元素的算法 C++实现(循环队列+模运算)
    数组a[MaxSize]用作一个循环队列,front指向循环队列中队头元素的前一个位置,rear指向队尾元素的位置。设计删除队列中第k个元素的算法。思路首先,判断kkk是否在有效范围内......
  • 【数据结构与算法】在循环队列中第k个元素之后插入元素的算法 C++实现(循环队列+模运算
    数组a[MaxSize]用作一个循环队列,front指向循环队列中队头元素的前一个位置,rear指向队尾元素的位置。设计在队列中第k个元素之后插入item的算法。思路首先,检查输入的位置k是否在合理的范围内,即1到queueSize(Q)(包含两端)。如果k在这个范围外,那么返回ERROR。然后,计......
  • 浅谈矩阵
    0.前言感谢远古神猴tz1带来的30分钟极速版矩阵乘法讲解,tql!1.矩阵作用矩阵本质是对一个向量的进行变换,也就是描述转移的东西,因此我们常常用其来加速转移过程。2.技巧让我们来结合几道题目来谈谈吧。2.1优化矩阵运算[CF1970E3]Trails首先,暴力矩阵转移是显然的,记\(p_i=l......
  • 栈、队列和数组有哪些主要区别
    1、数据存储和访问原则栈(Stack):存储原则:后进先出(LIFO,LastInFirstOut)。即最后加入的元素最先被移除。访问方式:只能访问栈顶元素。栈的插入(push)和删除(pop)操作都只能在栈顶进行。队列(Queue):存储原则:先进先出(FIFO,FirstInFirstOut)。即最早加入的元素最先被移除。访问方......
  • 栈、队列和数组的具体实例
    1、栈的具体实例1、自助餐厅的托盘:在自助餐厅中,托盘通常被堆叠在一起,顾客从顶部取出一个托盘,然后服务员会在底部补充一个新的托盘。这个过程体现了栈的后进先出(LIFO)特性。2、网页浏览器的历史记录:当你在网页浏览器中浏览网页时,浏览器会将你访问的网页地址保存在一个栈中......
  • Queue 队列 -- C语言实现 -
    队列队列的概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点FIFO(FirstInFirstOut)入队:进行插入操作的一端称为队尾出队:进行删除操作的一端称为队头链实栈代码实现Ququq.h#pragmaonce#define_CRT_SECURE_NO_WARNI......
  • 「队列」实现FIFO队列(先进先出队列|queue)的功能 / 手撕数据结构(C++)
    概述队列,是一种基本的数据结构,也是一种数据适配器。它在底层上以链表方法实现。队列的显著特点是他的添加元素与删除元素操作:先加入的元素总是被先弹出。一个队列应该应该是这样的:--------------QUEUE-------------———————————......