【MQ】RabbitMQ 高可用延时功能的探究

延迟消息如果使用延时交换机来实现,如果数据量过大,就会很占 CPU 资源,轻则时间误差大,重则 RabbitMQ 宕机

一、针对一个 RabbitMQ 节点

(1)利用队列+ ttl,将延迟消息根据 delay 的时间进行分级

比如两小时、一天,这两个级别:

  1. 小于两天的消息直接放在延迟交换机
  2. 两天到一天的交给 ttl 为两小时的队列
  3. 其余的交给 ttl 为一天的队列

而两个 ttl 队列绑定同一个死信交换机,死信被咱们的服务处理后重新发送(delay - ttl,或者消息本身携带时间的信息,重新计算 delay),再根据新的 delay 判断前往哪里

这里可行的原因是,队列 + ttl 的 CPU 消耗只用于队列头的那一条消息,在这里就可以保存很多消息

对于这个问题,RabbitMQ 这个插件更适合于 delay 比较均匀的情况,一般到这里就结束了,但是有个坑点,一个热点时间的延迟消息会一起进入延迟交换机

(2)对于热点时间的消息处理

可以在发送到延迟交换机之前,先监控其数量(可以用 Redis 实现一个计数器),控制在一个可控的量级,如 10W,在范围内则发送,否则

  1. 存储起来,可以是 Mysql,也可以是 Redis,或者利用 RabbitMQ 的优先级队列,但是要主动的获取消息而不是监听
  2. 周期性的扫描(五分钟左右),监控 RabbitMQ 延时交换机的健康值,可以加入就加入(delay 小的先加入)(也可以 delay 相同的同一种消息合并成一个,与监听器约定一下这种情况)
  3. 但可能因为没及时扫描,导致新 delay ≤ 0,因此可能产生误差,我们可以将 delay 小于周期间隔的
    1. 接受误差的范围内的不给予处理
    2. 直接本地延时任务、交给 Redis 做延时队列分担多出来的这一份数据量(反正就是天女散花,将这个任务分担给其他服务)

如果是一个热点时间,消息的 delay 都很接近,但其实经过多次周期性的扫描,这个热点时间的消息大部分都可以进入延时交换机,再用 Redis 在最后接近热点时间,“冲刺”的时候助 RabbitMQ 一臂之力

以上是单机情况下我能想到的最好方案了,世界上没有绝对完美的东西,你可能描述一个极端的场景依旧可能出现问题,因此你可以解决其本质原因 “就是一个 MQ 处理不过来”

对于这种大数据量的情况,这一业务独享一个 RabbitMQ,减少 CPU 在其他业务的损耗

二、多个 RabbitMQ 节点相互扶持

因为集群针对的是队列中消息的同步,并不会同步延时交换机暂存的消息,这样不同的 RabbitMQ 去维护各自的延迟交换机就行了,让各个节点的延时交换机的数据量处在安全值范围内,之后到达队列再消息同步

你可能说,那宕机了,岂不是丢失了🤣,我们这样子做就是为了多个节点相互扶持,单机不宕机啊,同步了的话那每个节点都岌岌可危

  1. 旧的延时消息持久化了,有保证可靠性,重启即可
  2. 新的延时消息前往存活的节点

你可以维护一个表,就是延时消息表,设立时间误差进行周期性的扫描,将过期未删除记录的消息重新发送,作为一个兜底**(可以用任务调度平台去控制这些任务吧,如果 MQ 都很健康,其实也没必要一直扫描)**

但这种很极端,因为这样子做的话,我们就相当于不相信 MQ,一棒子打死所有人,但其实消息到 MQ 后,我们就只能全身心相信 MQ 持久化了我们的消息

我们不如直接重启这个挂掉的 MQ

注意:记得给每个节点安装延时交换机的插件

三、ttl 消息 + 优先级队列

RabbitMQ 还可以实现优先级队列

暂时不考虑 CPU 的损耗,我认为在定时方面可以忽略不记
优先级队列还不支持策略定义(但除了一些特殊需要,我们平时也用不到)

因此,如果将消息的 max - ttl 作为优先级,放入优先级队列里,是可以实现队列头为最小的 ttl,最先过期的会排在前面

定义队列的时候,设置 args “x-max-priority” 为 max,max 最大可以取 255,所以其优先级数量只可以为 1-255 个,一些甚至只能是 2-10 个

也就是说 ttl 的可选访问很小(固定只能 1-255 这个整数范围,只能控制时间单位改变其值域)

这个方法实现的延迟功能,取值有限,只能在特殊场景下使用

四、其他

RabbitMQ 的解决方案并不是绝对完美的,如果有特殊要求可以考虑其他的技术栈

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pip3命令全解析:Python3包管理工具的详细使用指南

pip3命令全解析:Python3包管理工具的详细使用指南 一、基本使用二、升级和更新三、其他常用命令四、换源操作五、注意事项六、帮助信息pip3命令使用说明 pip3 是 Python 3 的包管理工具,用于安装、升级和卸载 Python 3 的包。以下是 pip3 的常用命令及详细说明: 一、基本使…

开启对话式智能分析新纪元——Wyn商业智能 BI 携手Deepseek 驱动数据分析变革

2月18号,Wyn 商业智能 V8.0Update1 版本将重磅推出对话式智能分析,集成Deepseek R1大模型,通过AI技术的深度融合,致力于打造"会思考的BI系统",让数据价值触手可及,助力企业实现从数据洞察到决策执…

使用PyCharm创建项目以及如何注释代码

创建好项目后会出现如下图所示的画面,我们可以通过在项目文件夹上点击鼠标右键,选择“New”菜单下的“Python File”来创建一个 Python 文件,在给文件命名时建议使用英文字母和下划线的组合,创建好的 Python 文件会自动打开&#…

第三个Qt开发实例:利用之前已经开发好的LED驱动在Qt生成的界面中控制LED2的亮和灭

前言 上一篇博文 https://blog.csdn.net/wenhao_ir/article/details/145459006 中,我们是直接利用GPIO子系统控制了LED2的亮和灭,这篇博文中我们利用之前写好的LED驱动程序在Qt的生成的界面中控制LED2的亮和灭。 之前已经在下面两篇博文中实现了LED驱动…

【Unity】性能优化:UI的合批 图集和优化

目录 前言一、合批测试二、图集 前言 注意:DC指的是Draw Call。 温馨小提示:Frame Debugger 窗口(菜单:Window > Analysis > Frame Debugger)会显示绘制调用信息,并允许您控制正在构建的帧的“回放”…

【安当产品应用案例100集】037-强化OpenVPN安全防线的卓越之选——安当ASP身份认证系统

在当前数字化时代,网络安全已成为企业发展的重要组成部分。对于使用OpenVPN的企业而言,确保远程访问的安全性尤为重要。安当ASP身份认证系统凭借其强大的功能和便捷的集成方式,为OpenVPN的二次登录认证提供了理想的解决方案,特别是…

表单与交互:HTML表单标签全面解析

目录 前言 一.HTML表单的基本结构 基本结构 示例 二.常用表单控件 文本输入框 选择控件 文件上传 按钮 综合案例 三.标签的作用 四.注意事项 前言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;其中表单&#xff08;<form>&…

python卷积神经网络人脸识别示例实现详解

目录 一、准备 1&#xff09;使用pytorch 2&#xff09;安装pytorch 3&#xff09;准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1&#xff09;导入库 2&#xff09;数据预处理 3&#xff09;加载数据 4&#xff09;构建一个卷积神经网络 5&#xff0…

防御保护-----前言

HCIE安全防御 前言 计算机病毒 ​ 蠕虫病毒----->具备蠕虫特性的病毒&#xff1a;1&#xff0c;繁殖性特别强&#xff08;自我繁殖&#xff09;&#xff1b;2&#xff0c;具备破坏性 蠕虫病毒是一种常见的计算机病毒&#xff0c;其名称来源于它的传播方式类似于自然界中…

java和vue开发的图书馆借阅管理系统小程序

主要功能&#xff1a; 学生借书还书&#xff0c;管理员管理图书管理学生借书还书。系统显示在馆数量和图书总数量&#xff0c;借书时借书数量不可超过在馆数量&#xff0c;还书时需要输入归还数量&#xff08;可借2本书&#xff0c;归还的时候一本一本归还&#xff0c;可查看归…

【R】Dijkstra算法求最短路径

使用R语言实现Dijkstra算法求最短路径 求点2、3、4、5、6、7到点1的最短距离和路径 1.设置data&#xff0c;存放有向图信息 data中每个点所在的行序号为起始点序号&#xff0c;列为终点序号。 比如&#xff1a;值4的坐标为(1,2)即点1到点2距离为4&#xff1b;值8的坐标为(6,7)…

Oracle的学习心得和知识总结(三十三)|Oracle数据库数据库的SQL ID的底层计算原理分析

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

将DeepSeek接入Excel实现交互式对话

引言 将DeepSeek接入Excel&#xff0c;为你带来前所未有的交互体验&#xff01;“哪里不懂&#xff0c;选中哪里”&#xff0c;然后直接在侧边栏对话框向DeepSeek发问&#xff0c;非常地方便&#xff01; 案例演示 设置接入方式 既可以通过本地部署的DeepSeek接入Excel&#…

在npm上传属于自己的包

最近在整理代码&#xff0c;上传到npm方便使用&#xff0c;所以学习了如何在npm发布一个包&#xff0c;整理写成一篇文章和大家一起交流。 1、注册npm账号 npm | Home 2、确保是登录状态 &#xff08;在包目录下&#xff0c;终端执行 npm login) 按enter键自动打开页面&…

JS宏进阶:XMLHttpRequest对象

一、概述 XMLHttpRequest简称XHR&#xff0c;它是一个可以在JavaScript中使用的对象&#xff0c;用于在后台与服务器交换数据&#xff0c;实现页面的局部更新&#xff0c;而无需重新加载整个页面&#xff0c;也是Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;…

【快应用】多语言适配案例

【关键词】 多语言,$t 【问题背景】 快应用平台的能力会覆盖多个国家地区,平台支持多语言的能力后,可以让一个快应同时支持多个语言版本的切换,开发者无需开发多个不同语言的源码项目,避免给项目维护带来困难。使用系统默认的语言,开发者配置多语言的方式非常简单,只…

PyQt学习记录

0. 安装配置 0.1 安装相关库 首先打开你的PyCharm程序&#xff0c;然后新建一个目录用于学习&#xff0c;其次在terminal中输入 pip install pyqt5如果你不具有科学上网能力&#xff0c;请改为国内源 pip install pyqt5 -i https://pypi.douban.com/simple然后安装pyqt相关…

【多模态大模型】系列3:语义分割(LSeg、GroupViT)

目录 1 LSeg2 Group ViT 1 LSeg LANGUAGE-DRIVEN SEMANTIC SEGMENTATION LSeg是第一篇将CLIP应用于语义分割的论文。它的分割的效果拔群&#xff0c;容错能力也很高&#xff1a; 模型总览图跟CLIP很像&#xff1a; 对于图像链路&#xff1a;输入一张图片&#xff0c;进入分割…

【深度学习】多目标融合算法(四):多门混合专家网络MMOE(Multi-gate Mixture-of-Experts)

目录 一、引言 二、MMoE&#xff08;Multi-gate Mixture-of-Experts&#xff0c;多门混合专家网络&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、…

自动驾驶数据集三剑客:nuScenes、nuImages 与 nuPlan 的技术矩阵与生态协同

目录 1、引言 2、主要内容 2.1、定位对比&#xff1a;感知与规划的全维覆盖 2.2、数据与技术特性对比 2.3、技术协同&#xff1a;构建全栈研发生态 2.4、应用场景与评估体系 2.5、总结与展望 3、参考文献 1、引言 随着自动驾驶技术向全栈化迈进&#xff0c;Motional 团…