业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23292 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

24|UUID:如何高效生成全局的唯一ID?

不借助外部组件实现单点ID发生器
考虑系统问题和性能瓶颈
UUID和Snowflake本地生成
单点生成器和数据库实现
两种思路:额外系统生成ID、本地规则约束生成ID
计数器耗尽等待下一毫秒
当前时间戳内计数器
初始化节点ID和时间戳
每秒产生400w+序号
包含时间戳、机器ID、序列号
64位长整型
由Twitter开源
重复概率低
随机数生成
MD5计算
名字唯一性
128位二进制数
多版本实现
本地生成
提升性能
减少数据库写次数
批量申请ID
数据库写入性能瓶颈
多库分配ID策略
水平扩展
利用数据库auto_increment
服务器异常重启问题
时钟回拨问题
本地时钟和计数器
独立部署的服务
高TPS需求
多台服务器协调
课后作业
实现细节
版本4:基于随机性计算
版本3:基于名字计算
利用单点服务
基于数据库实现ID生成器
单点ID生成器
加密算法混淆
安全性考虑
内存中的计数器
粗略有序性
全局唯一性
总结
Snowflake
UUID
分布式环境
单体环境
核心需求
全局唯一ID生成算法(UUID)

该思维导图由 AI 生成,仅供参考

你好,我是微扰君。
今天我们来聊一聊在生产环境中非常常用的一个算法——全局唯一 ID 生成算法,也就是我们通常说的 UUID。
就和我们在社会中都有自己的身份证号作为自己的唯一标示一样,在互联网的应用中,很多时候,我们需要能生成一个全局唯一的 ID,去区别不同业务场景下的不同数据,比如消息 ID、用户 ID、微博内容 ID 等等。
因为我们往往需要通过这个 ID 去索引某个业务数据,所以一定要保证生成的 ID 在全局范围内是唯一的,这也是 identifier 的本意,在部分情况下,冲突概率很小可能也是可以接受的。另外,这个 ID 通常需要按照某种规则有序排列,最常用的就是基于时间进行排序。
所以全局唯一 ID 的两个核心需求就是:
全局唯一性
粗略有序性
那业界是如何生成满足这两大需求的 ID,又有哪些方案呢?我们开始今天的学习。

单体环境

在单体的应用中,保证 ID 的全局唯一,其实不是一个很大的问题,我们只需要提供一个在内存中的计数器,就可以完成对 ID 的颁发。
当然这样的 ID 可能会带有明确的含义,并被暴露出去了,比如在票务系统中,如果这样设计,我们能根据电子票 ID 判断出自己买的是第几张票。这对安全性要求更高的业务来说,是不可接受的,但通过一些简单的加密算法混淆,我们就能解决这个问题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

分布式唯一ID生成算法是在生产环境中广泛使用的重要技术。本文介绍了两种主流的分布式ID生成方案:引入单点ID生成器和基于数据库的实现,以及在业务侧本地生成ID的方案,其中包括UUID和Snowflake算法。UUID是一种常见的全局唯一ID生成算法和协议,通过本地产生ID,不需要远程调用独立服务。Snowflake算法则是一种引入了机器编号和时间信息的分布式ID生成算法,由业务方本地执行。这些方案都旨在满足全局唯一性和粗略有序性的需求,但需要根据具体业务场景和性能要求选择合适的实现方式。总结来看,备份节点来提高可用性、批量读写来提高系统性能、本地计算来避免性能瓶颈是关键思想。读者可以从中学习到如何解决分布式系统中的ID生成问题,以及在引入外部组件时需要考虑的问题和性能瓶颈。文章内容简洁明了,适合技术人员快速了解分布式ID生成算法的实现原理和应用场景。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 雨落~紫竹
    有问题。人家就10毫秒来10万个 你这不都有问题了
    2022-07-18
    1
    1
  • peter
    请教老师四个问题: Q1:重试幂等使用的ID用什么方法生成? Q2:个人电脑,比如我使用的笔记本,我并没有对它进行过时间同步操作, 请问这个笔记本会自动进行时间同步吗? Q3:Snowflake算法的bit0为什么不用?maxNodeId为什么要1024减去1? maxSequence为什么要4096减去1? Q4:能否举几个分布式ID在互联网的典型应用? 比如XX场景下用XX方法?
    2022-02-15
    1
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部