我们用RocketMQ发送信息的时候通常都会返回如下信息:

SendResult [sendStatus=SEND_OK, msgId=0A42333A0DC818B4AAC246C290FD0000, offsetMsgId=0A42333A00002A9F000000000134F1F5, messageQueue=MessageQueue [topic=topicTest1, brokerName=mac.local, queueId=3], queueOffset=4]

对于客户端来说msgId是由客户端producer自己生成的,offsetMsgId是由服务端broker生成的,其中offsetMsgId就是我们在rocketMQ控制台直接输入查询的那个messageId。

下面就来介绍一下这两个ID的生成算法:

msgId:

以下是RocketMQ部分源码的节选

初始化参数LEN,FIX_STRING,COUNTER

初始化buffer

设置开始时间

字节转string工具方法

最终生成msgId

其中createUniqId就是最终生成msgId方法。除些之外的方法者是createUniqId调用或者被间接调用的方法,这些方法实现也比较简单。这里就不一一解释了~

StringBuilder sb = new StringBuilder(LEN * 2);

由此可知msgId的长度是LEN * 2 = 16 * 2 = 32;

设time = 当前时间 - 本月开始时间(ms);

从代码得到 FIX_STRING = ip + 进程pid + MessageClientIDSetter.class.getClassLoader().hashCode();

createUniqIDBuffer 加入time 和 counter 因子。

最终得到msgId的生成因子是: ip + 进程pid + MessageClientIDSetter.class.getClassLoader().hashCode() + time + counter(AtomicInteger自增变量)

最后调用bytes2string进行十六进制的移位和编码就产生了我们的msgId。

那我们来分析一下这个算法:

对于每个producer实例来说ip都是唯一的,所以不同producer生成的msgId是不会重复的。对于producer单个实例来说的区分因子是:time + counter。首先应用不重启的情况下msgId是保证唯一性的,应用重启了只要系统的时钟不变msgId也是唯一的。所以只要系统的时钟不回拨我们就可以保证msgId的全局唯一。

有人也许会说应用运行了一个月再进行重启msgId就会重复了。从生成算法上来说是的!但是MQ的message是有时效性的,有效期是72小时也就是3天。每天的凌晨4点rocketMQ会把过期的message清除掉。所以msgId也是保证全局唯一的。

offsetMsgId:

broker端生成的offsetMsgId就比较简单了,直接就是主机ip + 物理分区的offset,再调用UtilAll.bytes2string进行移位转码就完成了,是不是很简单粗爆?!

以上就是RocketMQ生成msgId和offsetMsgId的生成算法。

RocketMQ 介绍 msgId生成算法相关推荐

  1. Cmpp MsgId 生成算法

    最近做一个项目要实现CMPP网关,基于不重复造轮子的原则,查遍开源社区也没有找到相关开源代码. 实在没有办法逼着自己学习已经还给老师的计算机原理,废话不多说,直接贴代码. 信息标识,生成算法如下: 采 ...

  2. Hilbert曲线简单介绍及生成算法

    Hilbert曲线 Hilbert曲线是一种填充曲线,相似的填充曲线还包含Z曲线.格雷码等其它方法.Hilbert曲线根据自身空间填充曲线的特性,能够线性地贯穿二维或者更高维度每一个离散单元.而且只穿 ...

  3. php hmacsha1计算,PHP HMAC_SHA1 算法 生成算法签名

    HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议. 它可 ...

  4. cutting stock 问题的列生成算法

    本文以 cutting stock 问题为例,介绍列生成算法的数学模型. 1. 问题描述 长板长度:10m 子板需求:2m: 100; 3m: 50; 5m: 20 - 优化目标:最小化,长板切割总数 ...

  5. 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型...

    from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...

  6. 无需向量监督的矢量图生成算法,入选CVPR 2021 | 代码开源

    说起图像生成算法,大家也许并不陌生. 不过,大多数算法都针对栅格图像,也就是位图,而不支持矢量图. 虽然也有一些生成矢量图形的算法,但是在监督训练中,又受限于矢量图数据集有限的质量和规模. 为此,来自 ...

  7. 实验三:实现一个大素数生成算法

    一.实验内容 掌进一步掌握大素数分解的一般原理和实现方法.能用间接方法实现大素数分解.用代码实现Solovay-Strassen素性测试法或Miller-Rabin素性测试法. 二.分实现一个大素数生 ...

  8. matlab画梅花,基于Matlab图像素描生成算法究.doc

    毕 业 文 图像素描生成算法研究 姓 名 院(系) 信息学院 专业班级 学 号 指导教师 职 称 论文答辩日期 年月日 摘 要 分析比较图像处理提供参考.关键词: 目 录 1 前言1 1.1 课题研究 ...

  9. snowflake算法 php,Snowflake —— 分布式全局唯一 id 生成算法

    简介 Snowflake 是 Twitter 提出一种的分布式唯一序列号生成算法,理论上单节点 1 毫秒可以生成 4096 个(每秒四百万个)唯一序列,这个序列是个 long 类型的数字,在数据库中的 ...

最新文章

  1. TVM自定义数据类型
  2. 基础二维计算几何板子[预备知识]
  3. Linux入门!Linux无法联网解决办法!CentOS7、VMPlayer、VMWareWorkstation16资源!VMWareWorkstation16序列号!VMware安装Centos7!
  4. __clone class php_PHP 对象克隆 clone 关键字与 __clone() 方法
  5. 若川的2018年度总结,平淡无奇
  6. iPhone 的 Push(推送通知)功能原理浅析
  7. .NET 为大型应用接入 ApplicationStartupManager 启动流程框架
  8. ​我敢说,这是最全的常用设计模式汇总
  9. disable jboss JMXInvokerServlet .
  10. js 编写一道程序题输入长和宽之后点击按钮可弹出长方形面积。
  11. Kafka 日志消息保存时间
  12. SeaweedFS安装部署
  13. 关于解决华硕TUF B360M-PLUS GAMING在WIN10下无网卡驱动的方法
  14. Virtual-Taobao: Virtualizing Real-World Online Retail Environment for Reinforcement Learning
  15. 目光远大,不要被小许诺所牵绊,唯有自我提升是真理
  16. 输出4+44+444+4444
  17. 【云迁移教程】从阿里云迁移到华为云(生产环境)
  18. Ubuntu安装QQ、VM、Chrom软件
  19. 刷题刷题(个人记录)
  20. 专访|单月 GMV 破千万,5800 万用户,樊登读书视频生态解读

热门文章

  1. ME | 决定性过程促进了深层土壤微生物空间周转率的增加
  2. Science给博士新生的“欢迎”信:5点期望太扎心!
  3. 专家点评Science:中英合作揭示拟南芥三萜化合物特异调控根系微生物组
  4. 微生物组文献1采用FimH拮抗物选择性抑制尿路致病性大肠杆菌
  5. R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、效用值的情况下计算需要的样本量
  6. pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行
  7. R语言筛选dataframe分组中值最大的行实战(Select the row with the maximum value in each group)
  8. 什么是类别不平衡?有哪些解决方案?
  9. 学习笔记:数据分析和处理(ML计算模型前的预处理)——持续更新
  10. pip3 install numpy