本文共 1065 字,大约阅读时间需要 3 分钟。
雪花算法:分布式全局唯一ID的高效解决方案
为什么需要分布式全局唯一ID
在复杂分布式系统中,数据和消息的唯一标识是至关重要的。例如,像美团点评、猫眼电影等产品的系统中,数据逐渐增长,分库分表后需要一个唯一ID标识数据或信息。订单、骑手、优惠券等都需要唯一ID作为标识。因此,一个能够生成全局唯一ID的系统显得尤为必要。
ID生成规则的硬性要求
全局唯一性:ID必须唯一,避免重复,这是最基本的要求。 趋势递增:数据库如MySQL的InnoDB引擎使用聚集索引,主键应尽量有序,确保写入性能。 单调递增:下一个ID必须大于上一个,适用于事务版本号、IM增量消息等。 信息安全:ID应无规则,防止恶意爬取和竞争对手推测。 含时间戳:便于追踪生成时间。 ID生成系统的可用性要求
高可用:99.999%的情况下保证唯一ID生成。 低延迟:获取ID应极速完成。 高QPS:支持高并发请求,例如10万次同时创建ID。 通用方案:UUID的局限性
- 性能:本地生成,性能较高,但无序难以预测。
- 主键问题:UUID长度较长,不适合作为主键。
- 索引问题:插入无序数据影响性能。
数据库自增主键的局限
- 扩展困难:难以支持机器台数扩展。
- 性能瓶颈:每次获取ID需数据库读写,影响高并发处理。
- 分库分表问题:唯一性冲突和数据一致性难以保证。
Redis生成ID策略
- 单机优化:Redis单线程保证原子性,性能优异。
- 集群问题:维护复杂,难以支持高并发。
雪花算法:高效分布式ID解决方案
雪花算法由Twitter开发,用于生成可排序的64位分布式ID。其结构包括:
41位时间戳:记录毫秒级时间,支持69年。 10位机器ID:区分数据中心和服务器,支持1024台机器。 12位序列号:每毫秒生成4096个ID。 雪花算法的优点:
- 高效性能:每秒生成26万ID。
- 全局唯一性:结合数据中心和机器ID,避免重复。
- 灵活配置:可根据业务需求调整各部分位数。
工程落地经验
工具包集成:使用Hutool工具包简化雪花算法集成。 SpringBoot整合:通过依赖管理和工具类实现高效ID生成。 分布式应用:支持高并发场景下的多线程ID生成,确保唯一性。 雪花算法的优缺点
优点:
- 高效性能:支持高并发和高QPS。
- 无依赖第三方:分布式部署,稳定性高。
- 灵活配置:适应不同业务需求。
缺点:
- 时钟问题:机器时钟回拨可能导致重复ID。
- 递增性:分布式环境下时钟不完全同步,通常只要求趋势递增。
其他补充
百度和美团等公司开源了更优化的分布式ID解决方案,值得参考。
转载地址:http://xkhfk.baihongyu.com/