文章插图
导读:唯一ID可以标识数据的唯一性,在分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种
- 依赖数据库,使用如MySQL自增列或Oracle序列等 。
- UUID随机数
- snowflake雪花算法(本文将要讨论)
采用数据库自增序列:
- 读写分离时,只有主节点可以进行写操作,可能有单点故障的风险
- 分表分库,数据迁移合并等比较麻烦
- 采用无意义字符串,没有排序
- UUID使用字符串形式存储,数据量大时查询效率比较低
有这么一种说法,自然界中并不存在两片完全一样的雪花的 。每一片雪花都拥有自己漂亮独特的形状、独一无二 。雪花算法也表示生成的ID如雪花般独一无仁 。
文章插图
雪花算法概述
雪花算法生成的ID是纯数字且具有时间顺序的 。其原始版本是scala版,后面出现了许多其他语言的版本如JAVA、C++等 。
组成结构
文章插图
大致由:首位无效符、时间戳差值,机器(进程)编码,序列号四部分组成 。
特点(自增、有序、适合分布式场景)
- 时间位:可以根据时间进行排序,有助于提高查询速度 。
- 机器id位:适用于分布式环境下对多节点的各个节点进行标识,可以具体根据节点数和部署情况设计划分机器位10位长度,如划分5位表示进程位等 。
- 序列号位:是一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号
三、雪花算法的缺点
雪花算法在单机系统上ID是递增的,但是在分布式系统多节点的情况下,所有节点的时钟并不能保证不完全同步,所以有可能会出现不是全局递增的情况 。
四、总结
分布式唯一ID的方案有很多,本文主要讨论了雪花算法,组成结构大致分为了无效位、时间位、机器位和序列号位 。其特点是自增、有序、纯数字组成查询效率高且不依赖于数据库 。适合在分布式的场景中应用,可根据需求调整具体实现细节 。
感谢您的阅读,如果喜欢本文欢迎关注和转发,本头条号将持续分享IT技术知识 。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步 。
【分布式ID生成--雪花算法】
推荐阅读
- 如何设计实现一个通用的分布式事务框架?
- 京东架构师分享:微服务分布式一致性模式
- 梦见涨大洪水自己逃生成功 梦见涨大洪水预示什么周公解梦
- Python 爬虫如何获取 JS 生成的 URL 和网页内容?
- 图解一致性哈希算法,分布式缓存就是这么简单
- 基于分布式系统的7种唯一ID实现方案
- .NET如何生成大量随机数据
- Java技术分享:一致性更强的分布式数据库中间件
- Java 分布式系统如何实现session共享?
- 分布式系统中的 CAP 定理