当前位置: 首页 > article >正文

RabbitMQ延迟消息的两种实现方式

简述RabbitMQ延迟消息的两种实现方式

前言

在实际业务中,往往会遇到例如:订单10分钟后过期、会议1小时后开始、商品3天后下架等等需求。

对于普通的消息队列,消息一旦被发送到队列内,消费者就可以直接消费,无法实现诸如过期订单的需求。

那么就需要特殊的技术来实现,RabbitMQ中有两种实现方式:TTL+死信队列插件

TTL+死信队列

TTL就是Time To Live,也就是消息存活时间

可以选择为一个消息队列设置TTL,或者为某条消息设置TTL,区别在于:

如果为消息队列设置了TTL,那么当该消息队列中的消息存在时长达到了TTL,也就是该消息过期了,消息队列就会立刻将该消息丢弃。

如果为某条消息设置了TTL,消息队列只会在消息将被消费时才会进行TTL检查,如果检查发现该条消息过期了,才会将消息丢弃。也就是说,这种情况下,如果消息还没有要被消费,就算消息早已经过期很久了,也不会被丢弃。

丢弃的消息,并不是被销毁了,而是被转移到死信交换机里了,再由死信交换机路由死信队列,顾名思义,死信队列就是死信的消息队列。

当消息被检测到TTL过期时,会被转移到死信交换机,再由死信交换机从多个死信队列中选一个死信队列,将过期的消息,也就是死信,路由到该死信队列,消费者再从死信队列中消费消息,也就实现了延迟消息(或者称为延迟队列)。

TTL的两种设置方式中,

如果为消息队列设置TTL,就会导致该消息队列内的每条消息都有固定的一样的TTL,如果想要提供更多的TTL选择,就需要提供更多的消息队列,灵活性不高。

如果为消息设置TTL,就会导致由于消息堵塞,过期消息并未即时转移到死信队列的情况,可用性不高。

两种TTL设置方式需具体业务具体分析。

插件

RabbitMQ官方提供了一个插件:rabbitmq_delayed_message_exchange,可以用来快速实现延迟消息

该插件可以让交换机本身具备延迟发送消息的功能,也就是延迟交换机

通过延迟交换机,可以灵活的为每条延迟消息设置一个延迟时间,延迟交换机会根据消息的延迟时间进行发送。

使用插件的方法,实现较为简易,延迟时间的灵活性较高,

TTL+死信队列的方法,由于是通过原生特性实现的,所以性能较高。


http://www.kler.cn/a/535007.html

相关文章:

  • 【码道初阶】Leetcode540. 有序数组中的单一元素,异或运算在二分查找的优雅实现(附异或运算详解)
  • 尝试在Office里调用免费大语言模型的阶段性进展
  • C++ Primer 算术运算符
  • 控件【QT】
  • Got socket exception during request. It might be caused by SSL misconfiguration
  • 107,【7】buuctf web [CISCN2019 华北赛区 Day2 Web1]Hack World
  • 【JavaEE】Spring(9):Spring事务
  • 【YOLOv11改进- 注意力机制】YOLOv11+ACMix注意力机制(2021): 自注意力与卷积的聚合模块,助力YOLOv11有效涨点;
  • Apache SeaTunnel 整体架构运行原理
  • 【数据结构】循环链表
  • 最大矩阵的和
  • 《翻转组件库之发布》
  • Nexus简介及小白使用IDEA打包上传到Nexus3私服详细教程_ider2021 引用 nexus 上传
  • 怎么定义 vue-router 的动态路由?
  • 资源查找网址
  • es match 可查 而 term 查不到 问题分析
  • 前端开发知识梳理 - HTMLCSS
  • 202617读书笔记|《清溪俳句三百》——春有樱花,夏有蝉,秋有红叶,冬有雪
  • 寒假2.5
  • 【数据结构】(6) LinkedList 链表
  • 科技赋能数字内容体验的核心技术探索
  • 足球俱乐部管理系统的设计与实现
  • 【落羽的落羽 数据结构篇】单链表
  • Leetcode—340. 至多包含 K 个不同字符的最长子串【中等】Plus(力扣159变体罢了改个参数而已)
  • shell检测文件是windows格式还是unix
  • 智能门铃市场:开启智能家居新时代