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

扩展rocketMQ延迟等级

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1、问题

rocketMQ开源版只支持18种延时队列,期望扩展延迟等级,或者自定义延迟时间。

为什么她只支持18种呢?我们带着问题去看源码。

2、分析过程

分析过程较长,可以直接跳到后面看结论。

2.1、先从client端入手

Message msg = new Message(topic, tag, msgKey, msgBody.getBytes(RemotingHelper.DEFAULT_CHARSET));
// 组装消息时候需要设置延迟level,那么就从源码中的这个对象入手
msg.setDelayTimeLevel(level.getLevel());
defaultMQProducer.send(msg, sendTimeout);

2.2、查看rocketMQ源码使用delay level方式

a.在CommitLog类中找到了使用level方式:

b.在ScheduleMessageService类中找到了start方法,里面进行了初始化定时器:

c.在ScheduleMessageService.parseDelayLevel()中对level map进行了初始化

d.继续查看MessageStoreConfig类初始化和使用情况。

e.通过查看MessageStoreConfig的初始化过程,反查到了BrokerStartup.start()方法,也就是在broker启动加载了这个config(这点早该想到。。。)

通过反查代码,大致延迟队列处理流程应该是这样:message提交后会替换topic和queueId,每个queueId都有自己定时任务扫描队列,满足条件的放入commitLog中去消费。这样的好处是预设置了18种队列,代码实现方便,不用对消息进行排序操作。

既然知道原理和代码,那么修改方式也就十分简单了。

3、结论

在broken的配置文件中加入一行配置重启即可:

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

最好的方式是在后面追加,不要改前面18种。

后续:网上也找到一种实现任意延迟时间的方案(链接),方案实现较复杂,就算方案实现,收益也不高。添加部分延迟时间已满足需求。

 

 

转载于:https://my.oschina.net/kyle1970/blog/2253677

相关文章:

  • echarts花样作死的坑
  • 那些年让你迷惑的阻塞、非阻塞、异步、同步
  • Cloudopt-logger — Kotlin 实现的日志框架扩展
  • Linux日记本_04:阿里云ECS服务器(CentOS7)端口设置以及 MySQL数据库搭建
  • [js]- 两个对象的合并(Object.assign)
  • 火币交易细则
  • 阿里云服务器配置过程
  • redirectTo、navigateTo与switchTap区别
  • python3 猜数字小游戏2.0
  • python函数式编程一
  • .NET性能优化(文摘)
  • CentOS 7.5 运维之路之网络配置
  • Linux日志分析详解
  • 高德地图大批量数据(上万)画历史轨迹实现方案
  • java并发包
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android Volley源码解析
  • HashMap ConcurrentHashMap
  • linux学习笔记
  • magento 货币换算
  • MySQL的数据类型
  • PaddlePaddle-GitHub的正确打开姿势
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue--数据传输
  • 基于HAProxy的高性能缓存服务器nuster
  • 技术:超级实用的电脑小技巧
  • 力扣(LeetCode)965
  • 前端学习笔记之观察者模式
  • 如何优雅地使用 Sublime Text
  • 算法---两个栈实现一个队列
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 小程序button引导用户授权
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 怎么将电脑中的声音录制成WAV格式
  • kubernetes资源对象--ingress
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ###项目技术发展史
  • #laravel 通过手动安装依赖PHPExcel#
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1)(1.11) SiK Radio v2(一)
  • (三)docker:Dockerfile构建容器运行jar包
  • (一)基于IDEA的JAVA基础1
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原)Matlab的svmtrain和svmclassify
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET单元测试
  • .Net面试题4