RabbitMQ如何实现延迟消息?

news2024/10/6 4:08:22

RabbitMQ中是可以实现延迟消息的,一般有两种方式,分别是通过死信队列以及通过延迟消息插件来实现。

扩展:

死信队列

当rabbitMQ中的一条正常的消息,因为过了存活时间(TTL过期),队列长度超限,被消费者拒绝等原因无法被消费时,就会变成Dead Message ,即死信。

当一个消息变成死信之后,他就能被重新发送到死信对列中(其实是交换机-exchange)。

那么基于这样的机制,就可以实现延迟消息了。那就是我们给一个消息设定TTL ,但是并不消费这个消息,等他过期,过期后就会进入到死信队列,然后我们再监听死信队列的消息就行了。

而且,rabbitMq中的这个ttl是可以设置任意时长的,这相比于RocketMQ只支持一些固定的时长而显得更加灵活一些。

但是,死信队列的实现方式存在一个问题,那就是可能造成队头阻塞,因为队列是先进先出的,而且每次只会判断队头的消息是否过期,那么如果队头的消息时间很长,一直都不过期,那么就会阻塞整个队列,这时候即便排在他后面的消息过期了,那么也会被一直阻塞。

基于RabbitMQ的死信队列,可以实现延迟消息,非常灵活的实现定时关单,并且借助RabbitMQ的集群扩展性,可以实现高可用,以及处理大并发。他的缺点第一是可能存在消息阻塞的问题,还有就是方案比较复杂,不仅要依赖RabbitMQ,而且还需要声明很多队列处理,增加系统的复杂度

RabbitMQ插件

其实,基于RabbitMQ的话,可以不用死信队列也能实现延迟消息,那就是基于  rabbitmq_delayed_message_exchange插件,这种方案能够解决通过死信队列实现延迟消息出现的消息阻塞问题,但是该插件从RabbitMQ的3.6.12开始支持的,所以有对版本有要求。

这个插件是官方出的,可以放心使用,安装并启用这个插件之后,就可以创建x-delayed-message类型的交换机了。

前面我们 提到的基于死信队列的方式,是消息先回投递到一个正常队列,在ttl过期后进入死信队列,但是基于插件这种方式,消息并不会立即进入队列,而是先把他保存在一个基于erlang开发的mnesia数据库中,然后通过一个定时器去查询需要被投递的消息,再把他们投递到x-delayd-message交换机中。

基于rabbitmq插件的方式可以实现延迟消息,并且不存在消息阻塞的问题,但是因为是基于插件的,而这个插件支持的最大延迟时间是(2^32)-1毫秒,大约49天,超过这个时间会被立即消费。

不过这个方案也有一定 限制,它将延迟消息存在于mbesia表中,并且在当前节点上具有单个磁盘副本,存在丢失的问题。

目前该插件的当前设计并不真正适合包含大量延迟消息(例如数十万或者百万)的场景,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1490732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文精读】Attention Bottlenecks for Multimodal Fusion 视频分类任务

本文并非逐句翻译,添加个人理解与疑惑,如有需要,请自行阅读原文。 Attention Bottlenecks for Multimodal Fusion 多模态融合的注意力瓶颈 会议:NIPS2021 Benchmark:Audioset、Epic Kitchens和VGGSound等 Backbone&…

白酒:原料的预处理技术对白酒品质的影响

在豪迈白酒的酿造过程中,原料的预处理技术对白酒的品质起着至关重要的作用。预处理技术包括原料的选择、清洗、破碎、润料等环节,这些环节的处理方式直接影响着白酒的口感、香气和品质。云仓酒庄在原料的预处理技术方面进行了深入研究和探索,…

图扑数字孪生水电站,水力发电可视化运维

自水轮机的早期发明被用于农业灌溉,到 18 世纪末期的工业革命促使水轮机技术的改良,再到 19 世纪末水利发电的崛起,直至今日,智慧水电站数字孪生技术正处于蓬勃发展之中。通过整合物联网、大数据、云计算等现代信息技术&#xff0…

Python图像处理【21】基于卷积神经网络增强微光图像

基于卷积神经网络增强微光图像 0. 前言1. MBLLEN 网络架构2. 增强微光图像小结系列链接 0. 前言 在本节中,我们将学习如何基于预训练的深度学习模型执行微光/夜间图像增强。由于难以同时处理包括亮度、对比度、伪影和噪声在内的所有因素,因此微光图像增…

vscode设置打开浏览器

安装这个插件 Open Browser Preview

linemap | 这样好看的山峦地图真的可以快速绘制啦~~

上一次介绍了Python绘制svg的优秀可视化库Pygal,今天我们介绍一下一个优秀的R地图可视化绘制包-linemap包,顾名思义,该包是是为了绘制由线组成的地图,其官网如下:https://github.com/rCarto/linemap。该包主要拥有两个…

鸿蒙实战开发:【SIM卡管理】

概述 本示例展示了电话服务中SIM卡相关功能,包含SIM卡的服务提供商、ISO国家码、归属PLMN号信息,以及默认语音卡功能。 样例展示 基础信息 介绍 本示例使用sim相关接口,展示了电话服务中SIM卡相关功能,包含SIM卡的服务提供商、…

Android Studio Iguana | 2023.2.1版本

Android Gradle 插件和 Android Studio 兼容性 Android Studio 构建系统基于 Gradle,并且 Android Gradle 插件 (AGP) 添加了一些特定于构建 Android 应用程序的功能。下表列出了每个版本的 Android Studio 所需的 AGP 版本。 如果特定版本的 Android Studio 不支持…

pandas数据分析42——读取和写入stata和spss的数据格式

python就是胶水语言,啥文件基本都能读取,而且pandas作为数据分析最好用的包,其功能自然也很多,可以读取各种数据文件。 本次就来演示一下怎么读取stata文件,和spss文件,他们不仅储存了数据和变量&#xff…

如何解决iQOO手机运行uniapp真机调试时无法识别的问题

打开开发者选项,打开USB设置,把默认USB选项改成MIDI模式,就可以检测到手机了

Golang高级微调技术

本文分享了一些小技巧,可以帮助我们写出更简化、高效的Golang代码,从而获得更好的开发体验。原文: Fine-Tuning Golang: Advanced Techniques for Code Optimization 本文是Golang代码优化技术的综合指南,帮助我们释放 Golang 应用程序的全部…

微信小程序(五十)请求拦截器实现携token获取用户信息

注释很详细,直接上代码 上一篇 新增内容: 1.个人信息框基本样式 2.请求拦截器携token获取个人信息进行渲染 源码: utils/http.js import http from "wechat-http"//设置全局默认请求地址 http.baseURL "https://live-api.it…

Mybatis_plus-基础

一、简介 1.概述 文档地址:https://baomidou.com/ 概述:MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提…

前后端分离项目Docker部署指南(上)

目录 前言 一.搭建局域网 1.搭建net-ry局域网,用于部署若依项目 2.注意点 二.安装redis 创建目录 将容器进行挂载 ​编辑 测试是否安装成功 ​编辑 三. 安装MySQL 创建文件夹 上传配置文件并且修改 .启动MySQL容器服务 充许远程连接 四.部署后端 使用…

RISCV 中断控制器 PLIC APLIC (非MSI部分)

以下包含了 PLIC & APLIC 着重解释 APLIC 部分 参考 github 中 riscv-aia 规范1.0 ,第四章 APLIC 注:关于MSI的部分简略(等后续搞清楚) 本人处于学习阶段,不清晰的地方,请见谅 一、关于 PLIC 配置 1、…

【Python】-----基础知识

注释 定义:让计算机跳过这个代码执行用三个单引号/双引号都表示注释信息,在Python中单引号与双引号没有区别,但必须是成对出现 输出与输入 程序是有开始,有结束的,程序运行规则:从上而下,由内…

(1)预处理

我们需要的文件结构如上 main.cpp add.h add.cpp add.h 这里使用riscv的工具链编译为.i文件,需要使用-E,就是只进行预处理,我们可以得到两个.i文件即main.i和add.i main.i 这里看到main.i里头文件全部替换,然后多了三万多行 所以…

力扣经典题目解析--合并两个有序链表

原题地址: . - 力扣(LeetCode) 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 迭代 链表节点结构…

Day12-【Java SE进阶】JDK8新特性:Lambda表达式、方法引用、常见算法、正则表达式、异常

一、JDK8新特性 1.Lambda表达式 Lambda表达式是JDK 8开始新增的一种语法形式;作用:用于简化名内部类的代码写法。 注意:Lambda表达式并不是说能简化全部匿名内部类的写法,只能简化函数式接口的匿名内部类。 有且仅有一个抽象方法的接口。注意:将来我们见到的大部…

【音视频开发好书推荐】《RTC程序设计:实时音视频权威指南》

1、WebRTC概述 WebRTC(Web Real-Time Communication)是一个由Google发起的实时音视频通讯C开源库,其提供了音视频采集、编码、网络传输,解码显示等一整套音视频解决方案,我们可以通过该开源库快速地构建出一个音视频通…