【融云分析】如何实现分布式场景下唯一ID生成?

背景

对于一套分布式部署的 IM 系统,要求每条消息的 ID 要保证在集群中全局*且按生成时间有序排列。如何快速高效的生成消息数据的* ID ,是影响系统吞吐量的关键因素。那么,融云是如何做到生成全局*消息 ID 的呢?

首先需要明确下 ID 生成的核心需求:

1. 全局*

2. 有序

设计

融云消息数据的* ID 长度采用 80 Bit 。每 5 个 Bit ,进行一次 32 进制编码,转换为一个字符,字符取值范围是,( 2 ~ 9 ) 和 ( A ~ B ),其中,已经去掉容易造成肉眼混淆的,数字 0 和 1 ,及字母 O 和 I 。这样,80 Bit 可以转换为 16 个字符,再加上 3 个分隔符( – ),将 16 个字符分为 4 组,*终得到一个 19 字符的* ID 。 这样设计,即可以保证生成的 ID 是有序的,也能方便阅读。

【融云分析】如何实现分布式场景下唯一ID生成?

2. 获取一个自旋 ID , highBits 左移 12 位,并将自旋 ID 拼接到低 12 位中;

【融云分析】如何实现分布式场景下唯一ID生成?

3. 上步的 highBits 左移 4 位,将会话类型拼接到低 4 位;

【融云分析】如何实现分布式场景下唯一ID生成?

5. highBits 左移 6 位,并将 sessionIdInt 的高 6 位拼接到 highBits 的低 6 位中;

【融云分析】如何实现分布式场景下唯一ID生成?

7. highBits 与 lowBits 拼接,得到 80 Bit 的消息 ID 。对其进行 32 进制编码,即可得到*消息 ID 。编码规则如下:从左至右,每 5 个 Bit 转换为一个整数,以这个整数作为下标,即可在下表中找到对应的字符。

【融云分析】如何实现分布式场景下唯一ID生成?

总结:

这种 ID 生成的方式,需要注意保证自旋 ID 的生成是线程安全的。避免在并发情况下,生成出同样的 ID 。另外,此 ID 生成算法,强烈依赖系统时间,如果系统时间被改小,也可能造成 ID 生成重复。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:SEO优化专员,转转请注明出处:https://www.chuangxiangniao.com/p/902432.html

(0)
上一篇 2025年1月4日 02:52:30
下一篇 2025年1月4日 02:53:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论

联系我们

156-6553-5169

在线咨询: QQ交谈

邮件:253000106@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

联系微信