开源一个比雪花算法更好用的ID生成算法(雪花漂移)

2022-10-26,,,,

雪花算法好用的ID生成算法(单机或分布式唯一ID)

转载及版权声明

本人从未在博客园之外的网站,发表过本算法长文,其它网站所现文章,均属他人拷贝之作。

所有拷贝之作,均须保留项目开源链接,否则禁止转载。

拷贝之作,内容难免过期,当前页面才有最新内容。

算法介绍

一个全新的雪花漂移算法,生成的ID更短、速度更快。

核心在于缩短ID长度的同时,具有极高瞬时并发处理量(保守值 50W/0.1s)。

原生支持 C#/Java/Go/Rust/C 等语言,并由 Rust 提供 PHP、Python、Node.js、Ruby 等语言多线程安全调用库(FFI)。如果你的应用有语言开发,基于本算法提供的逻辑实现,集成会更简单,逻辑会更一致。

支持 k8s 等容器化部署,自动注册 WorkerId。

可在单机或分布式环境中生成唯一ID。

技术支持

开源地址1:https://gitee.com/yitter/idgenerator

开源地址2:https://github.com/yitter/idgenerator

QQ群:646049993

需求来源

作为架构设计的你,想要解决数据库主键唯一的问题,特别是在分布式系统多数据库的时候。

你希望这个主键是用最少的存储空间,索引速度更快,Select、Insert 和 Update 更迅速。

你要考虑在分库分表(合库合表)时,主键值可直接使用,并能反映业务时序。

如果这样的主键值太长,超过前端 JS Number 类型最大值,须把 Long 型转换为 String 型,你会觉得有点沮丧。

尽管 Guid 能自增,但占用空间大,索引速度慢,你也不想用它。

应用实例可能超过50个,每个并发请求可达10W/s。

在容器环境部署应用(水平扩展、自动伸缩)。

不想依赖 redis 的自增操作。

你希望系统运行 100 年以上。

传统算法问题

生成的ID太长。

瞬时并发量不够。

不能解决时间回拨问题。

不支持后补生成前序ID。

依赖外部存储系统。

新算法特点

整形数字,随时间单调递增(不一定连续),长度更短,用50年都不会超过 js Number类型最大值。(默认配置 WorkerId 是6bit,自增数是6bit)

速度更快,是传统雪花算法的2-5倍,0.1秒可生成50万个。(i7笔记本,默认算法配置6bit+6bit)

支持时间回拨处理。比如服务器时间回拨1秒,本算法能自动适应生成临界时间的唯一ID。

支持手工插入新ID。当业务需要在历史时间生成新ID时,用本算法的预留位能生成5000个每秒。

漂移时能外发通知事件。让调用方确切知道算法漂移记录,Log并发调用量。

不依赖任何外部缓存和数据库。(k8s环境下自动注册 WorkerId 的动态库依赖 redis)

基础功能,开箱即用,无需配置文件、数据库连接等。

性能数据

(参数:10位自增序列,1000次漂移最大值)

连续请求量 5K 5W 50W
传统雪花算法 0.0045s 0.053s 0.556s
雪花漂移算法 0.0015s 0.012s 0.113s

效果

开源一个比雪花算法更好用的ID生成算法(雪花漂移)的相关教程结束。

《开源一个比雪花算法更好用的ID生成算法(雪花漂移).doc》

下载本文的Word格式文档,以方便收藏与打印。