rocketmq实现延迟队列思路探讨

大家好,我是了不起,专为小白解决痛点的了不起。

一、非任意时间

1、修改

在服务器端(rocketmq-broker端)的属性配置文件中加入以下行:

messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

缺点:需要重启rocketmq的服务端

二、任意时间

1、借鉴原生的逻辑

先建立多个时间范围的level,依靠一个定时任务搬运,到一天以内的时候建立时间轮的方式建立时分秒三个表来查着着几个区间的数据,上一个级别的查到才会注册下一个级别的定时任务,执行完成后取消注册,时间轮有HashedWheelTimer,需要考虑持久化问题

2、时间轮加rocketmq

image
image

1.rocketMQ默认支持18个等级 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

2.支持任意延时,设计逻辑为拆分法,用默认的rocketMQ去支持 任意时间都能够通过上面的时间组装出来

3.在1分中内需要发送的采用时间轮方式,发送出去

4.延时会走 guava-topic,不会走业务需要的topic,只有当真正需要发送的时候才会走业务topic

5.考虑1分钟内由于强制重启等所带来的数据丢失问题. (TODO)

代码 https://github.com/civism/civism-rocket

优点 不需要依赖除rocketMQ以外的任何中间间,可以算是0侵入

支持任意时间纬度的延时

实现简单,浅显易懂,安全与否取决于rocketMQ

rocketMQ所有的优点

缺点 极端情况下会有一分钟的数据丢失(服务重启并且满足刚好进入时间轮)

增大了rocketMQ的自带的延时压力

rocketMQ所有的缺点

3、存储介质加时间轮:

生产延迟消息:延迟消息由两部分组成--该笔消息的订单号key+业务数据value;

存储消息:当把延迟消息组装好之后,把该消息(key,value)放入redis中并设置一定的超时时间同时存入时间轮数据结构中;

取出消息:当该消息在时间轮数据结构中到期时,取出key,然后根据这个key去redis中取value;

通过RocketMQ的生产者线程,把消息发送出去,若发送成功,则把redis中该key删除;若是发送失败,则记录日志,人工补偿;

每部分的作用是:

HashedWheelTimer:存储消息的key,key到期时,自动弹出---起到一个定时器的作用;

Redis:将完整的延迟消息存储到内存中时,还把数据持久化到硬盘,当redis重启时,基本不丢数据;

RocketMQ:发送延迟消息;

这里有几个问题需要注意:

当系统突然宕机,服务器重启后,时间轮HashedWheelTimer中的key都将消失,并且很难恢复,此时丢失的key对应在Redis中的value只能等待时间到期,这种情况怎么办,即数据丢失问题?也可以不使用Redis存储完整的消息,把完整的消息直接放入时间轮数据结构中或放入延迟队列DelayQueue中;用这种方式也会存在数据丢失的问题:即系统突然宕机,服务器重启后,未到期的数据都将丢失,因为对数据没有进行持久化;

当key从HashedWheelTimer中取出后,根据该key在Redis中没取到数据,这种情况该怎么办,即数据不一致的问题?

当消息到期后,用RocketMQ发送时,发送好几次都失败了,这时候除了记录日志,人工进行补偿之外,还有什么好的解决方案?--解决办法之一是:把这些发送失败的消息,存入数据库表中;然后启动一个定时任务,定时把发送失败的消息,通过RocketMQ再次发送出去,若发送成功,将该消息从数据库中删除;若这次还是发送失败,则下次定时任务执行时,再继续尝试发送。

这里的HashedWheelTimer可以用Delayqueue代替,它两相比较而言,HashedWheelTimer的时间复杂度比Delayqueue要好些。 参考借鉴: 1、https://github.com/civism/civism-rocket 2、https://blog.csdn.net/zhaoming19870124/article/details/94152008

写在最后

欢迎大家添加我的微信(识别下方二维码),我会在朋友圈更新日常思考,分享一下感悟和经历,可以围观朋友圈,一般不闲聊。

添加时备注消息“电子书”,还会送大家一份优质电子书资料

由于添加的好友较多,通过可能较慢,还望海涵!

扫描二维码,加我的微信,有好礼相送

alt

本文由 mdnice 多平台发布

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

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

相关文章

Vue高级(二)

3.搭建vuex环境 创建文件:src/store/index.js //引入Vue核心库import Vue from vue//引入Vueximport Vuex from vuex//应用Vuex插件Vue.use(Vuex)//准备actions对象——响应组件中用户的动作const actions {}//准备mutations对象——修改state中的数据const mutat…

Mantle: A Programmable Metadata Load Balancer for the Ceph File System——论文泛读

SC 2015 Paper 元数据论文阅读汇总 问题 优化Ceph的元数据局部性和负载平衡。 现有方法 提高元数据服务性能的最常见技术是在专用的元数据服务器(MDS)节点之间平衡负载 [16, 25, 26, 21, 28]。常见的方法是鼓励独立增长并减少通信,使用诸…

中文 DarkVoxel Wiki | CSDN

DarkVoxel Wiki 游戏DarkVoxel的中文百科~ 欢迎来到DarkVoxel Wiki! 本wiki于 2024/1/15 迁自 Fandom Wiki(因为 Fandom 实在是太烂了)以后wiki在这里更新,B站专栏只会发布每个版本的更新内容之类的简单资讯;相关视…

【物以类聚】给el-image预览多张图片增加提示文字,让每张图片有所分类

【物以类聚】给el-image预览多张图片增加提示文字,让每张图片有所分类 一、需求二、el-image三、实施步骤3.1 导包3.2 改造3.3 引入 三、效果 一、需求 点击地图上的一张图片,弹出所有相关的图片资源,图片资源上显示每个图片的所属类型。 二…

《产业结构调整指导目录(2024年本)》发布,模糊测试首次纳入

近日,第6次委务会议通过了新版的《产业结构调整指导目录(2024年本)》,该目录自2024年2月1日起正式实施。 与之前的版本相比,本次目录在行业设置上进行了全面升级,新增了“网络安全”这一重要行业大类&#…

金蝶云星空单据转换插件-选单

文章目录 金蝶云星空单据转换插件-选单 金蝶云星空单据转换插件-选单 选单使用标识报错 应该使用实体属性

杨中科 EFCORE 第五部分 同样的Linq 被不同数据据翻译为不同SQL

同样的LINQ 被翻译为不同的SQL 语句 不同数据库方言不同 SOLServer: select top(3) * from t MySOL: select * from t LIMIT 3 Oracle: select * from t where ROWNUM<3 同样的C#语句在不同数据库中被EF Core翻译成不同的SQL语句 EF CORE迁移脚本和数据库相关 因此迁移脚…

微信公众号对接--客服消息

当你关注公众号&#xff0c;然后在公众号里面发送消息&#xff0c;会收到回复&#xff0c;这个就是客服消息 参考文档:接收普通消息 接收事件推送 客服接口-发消息 想要对接客服消息&#xff0c;首先要获取access_token,这个可以参考我之前的文章:对接微信公众号-CSDN博客 回…

SpringBoot教程(九) | SpringBoot统一异常处理

SpringBoot教程(九) | SpringBoot统一异常处理 异常大家应该都很清楚&#xff0c;我们的项目总是不可避免的出现异常&#xff0c;那么应该如何优雅的进行异常处理使我们需要关注的一个问题&#xff0c;合理的异常封装既可以方便前端的处理&#xff0c;也能够简化后端的开发。 …

Stable Diffusion XL(SDXL)核心基础知识

文章目录 一、Stable Diffusion XL基本概念二、SDXL模型架构上的优化&#xff08;一&#xff09;SDXL的整体架构&#xff08;二&#xff09;VAE&#xff08;三&#xff09;U-Net&#xff08;四&#xff09;text encoder&#xff08;五&#xff09;refiner model 三、SDXL在训练…

软件测试|Python如何处理配置文件

配置文件在软件开发中起到了非常重要的作用&#xff0c;它允许开发者将应用程序的设置和参数存储在一个易于管理和修改的地方&#xff0c;而不是硬编码在代码中。Python有多种处理配置文件的方式&#xff0c;本文将介绍其中两种最常用的方法&#xff1a;使用configparser库和使…

HTML--CSS--超链接样式以及鼠标样式自定义

超链接伪类 再复习一下,超链接的定义方式如下&#xff1a; <!DOCTYPE html> <html> <head> <title>这是一个标题</title><meta charset"utf-8"/><style></style> </head> <body><a href"http…

Axure RP软件揭秘:设计师的秘密武器

Axure rp是一种快速原型设计工具&#xff0c;可以制作高度互动的HTML原型。设计师不仅可以使用Axure绘制线框图和原型&#xff0c;还可以在Axure rp中完成一系列用户体验设计。在本文中&#xff0c;我们将根据用户体验设计师的真实经验&#xff0c;触发用户体验设计师的实际工作…

如何实现本地USB设备共享服务映射到外网实现跨网USB共享通信访问

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序&#xff0c;它提供了共享和访问本地或互联网上的U…

vue的element ui使用el-table组件实现懒加载树、默认自动展开层级(一层,二层)、并且解决新增、删除、修改之后树节点不刷新问题

1.整体思路 问题&#xff1a;数据量太大了&#xff0c;导致接口返回数据时间较长。解决: 将ElementUi中Table组件加载改为懒加载&#xff08;查看文档&#xff09;。思路&#xff1a;初始化打开页面时只显示第一级菜单,用户点击展开菜单之后往后端发送请求,然后加载出一级子菜…

适当催一下没确认订单的国外客户

在一片美丽的森林里&#xff0c;住着两只小鸟。其中一只非常勤奋&#xff0c;每天都早早起床&#xff0c;练习飞翔和觅食。而另外一个小鸟却非常懒惰&#xff0c;每天总是赖在窝里&#xff0c;不愿意努力&#xff0c;懒惰的小鸟总是想&#xff1a;反正有那只勤奋的鸟儿在&#…

【Linux】初识Linux及几个基本指令

Hello everybody!算算时间我已经有一个多月没有更新啦&#xff01;因为本专业是纺织工程&#xff0c;所以一直在复习应付期末考试\(0^◇^0)/。那好&#xff0c;废话不多说。让我们进入今天的主题&#xff01; 关于Linux系统可能很多同学不是很熟悉&#xff0c;有的人可能听过&…

如何在网络爬虫中解决CAPTCHA?使用Python进行网络爬虫

网络爬虫是从网站提取数据的重要方法。然而&#xff0c;在进行网络爬虫时&#xff0c;常常会遇到一个障碍&#xff0c;那就是CAPTCHA&#xff08;全自动公共图灵测试以区分计算机和人类&#xff09;。本文将介绍在网络爬虫中解决CAPTCHA的最佳方法&#xff0c;并重点介绍CapSol…

软件测试|使用matplotlib绘制多种饼图

简介 Matplotlib是一个强大的数据可视化库&#xff0c;它允许我们创建各种类型的图表&#xff0c;包括饼图。饼图是一种用于显示数据分布的常见图表类型。在本文中&#xff0c;我们将介绍如何使用Matplotlib创建不同类型的饼图&#xff0c;并提供示例代码。 创建标准饼图 首…

Linux进程【2】进程地址空间(+页表详解哦)

fork 引言&#xff08;程序地址空间&#xff09;进程地址空间进程地址空间mm_struct 虚拟地址到物理地址的转化总结 引言&#xff08;程序地址空间&#xff09; 在之前的学习过程中&#xff0c;我们认识了内存与地址&#xff0c;并且了解了在程序地址空间中的基本分区&#xf…