RocketMQ msgId生成算法
2018-06-18 00:04:47来源:未知 阅读 ()
当我们用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的方式之外,在日常项目中如果有遇到类似遇到生成全局唯一key场景时是不是也可以借鉴一下RocketMQ的思路?如果文章有什么不理解的地方欢迎大家提出宝贵的意见,也欢迎大家多多交流~~~~
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- RocketMQ4.4 入门进阶+实战 2020-06-08
- 第六章第三十八题(生成随机字符)(Generate random charact 2020-06-02
- JavaGUI练习 - 正交测试用例生成小工具 2020-05-31
- 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文 2020-05-31
- Hibernate --主键生成策略 2020-05-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash