210 lines
32 KiB
Markdown
210 lines
32 KiB
Markdown
# IdGenerator
|
||
|
||
## 介绍
|
||
用一种全新的雪花漂移算法,让ID更短、生成速度更快。
|
||
核心在于缩短ID长度的同时,还能保持每毫秒并发处理量(50W/0.1s),且能保持伸缩能力。
|
||
|
||
## 需求来源
|
||
|
||
1.作为架构设计的你,想要解决数据库主键唯一的问题。
|
||
|
||
2.你希望这个主键是用最少的存储空间,索引速度更快的。
|
||
|
||
3.你还会考虑在分库分表(合库合表)的时候,主键值能直接使用,并能反映业务时序。
|
||
|
||
4.如果这样的主键值太长,超过前端 JS Number 类型最大值,估计你会把 Long 型转换为 String 型,你肯定觉得有点不正常。
|
||
|
||
5.自增Guid占用空间大,可能也不是你想要的。
|
||
|
||
6.你希望系统能运行 100 年以上。
|
||
|
||
|
||
## 传统雪花算法的问题
|
||
|
||
1.生成的ID太长。
|
||
|
||
2.并发量不够。
|
||
|
||
3.不能解决时间回拨问题。
|
||
|
||
4.不支持后补生成前序ID。
|
||
|
||
5.依赖外部缓存系统。
|
||
|
||
|
||
## 雪花漂移算法特点
|
||
|
||
1.ID更短,是传统算法的几倍,用50年都不会超过 js Number类型最大值。(默认配置WorkerId是6bit,自增数是6bit)
|
||
|
||
2.生成速度更快,0.1秒可生成50万个。(i7笔记本,默认算法配置6bit+6bit)
|
||
|
||
3.支持时间回拨处理。比如Linux服务器时间回拨1秒,本算法能自动适应生成临界时间的唯一ID。
|
||
|
||
4.支持手工插入新ID。当业务需要在历史时间生成新ID时,用本算法的预留位每秒能生成5000个。
|
||
|
||
5.漂移时对外异步发通知事件。让调用方确切知道算法漂移记录,Log并发调用量。
|
||
|
||
6.不依赖任何外部缓存和数据库。(但WorkerId必须由外部指定)
|
||
|
||
|
||
## 文件说明
|
||
|
||
1.SnowWorkerM1.cs 是雪花漂移算法。
|
||
|
||
2.SnowWorkerM2.cs 是传统雪花算法。
|
||
|
||
|
||
## 效果
|
||
|
||
1.js Number 类型最大数值:9007199254740992,本算法在保持并发性能(5W+/0.01s)和最大64个WorkerId(6bit)的同时,能用70年才到 js Number Max 值。
|
||
|
||
2.增加WorkerId位数到8bit(128节点)时,15年达到 js Number Max 值。
|
||
|
||
3.极致性能:500W/1s。
|
||
|
||
4.所有测试数据均基于8代低压i7计算。
|
||
|
||
|
||
## 适用范围
|
||
|
||
1.小型、中型、大型需要全局唯一Id(不用Guid)的项目。
|
||
|
||
2.分布式项目。
|
||
|
||
3.不想将 Long 型转 String 给前端用的项目。(若前端支持bigint,则可不转类型)
|
||
|
||
|
||
## 大型分布式使用建议
|
||
|
||
1.可扩大 WorkerIdBitLength 到最多20位,支持 1,048,576 个节点,且不影响上述并发性能(50W/0.1s)。
|
||
|
||
2.采用中心化 IdGenerator 集群,给节点生成可用 Id 列表,存入 Redis 队列供节点消费。此时64个中心化节点数足够大型互联网项目使用。
|
||
|
||
## 如何处理时间回拨
|
||
1.当发生系统时间回拨的时候,算法采用过去时序的预留序数(0-5)生成新的ID。
|
||
|
||
2.默认每秒可生成100个(速度可调整)。
|
||
|
||
3.回拨生成的ID序号,默认靠前,也可以调整为靠后。
|
||
|
||
4.允许时间回拨至本算法预设基数(参数可调,默认大于1年)。
|
||
|
||
|
||
## 能用多久
|
||
|
||
1.在默认配置下,ID可用 71000 年不重复。
|
||
|
||
2.在支持 1024 个工作节点时,ID可用 4480 年不重复。
|
||
|
||
3.在支持 4096 个工作节点时,ID可用 1120 年不重复。
|
||
|
||
4.以上所有工作节点,均拥有 50W/0.1s 最大处理速度。
|
||
|
||
|
||
## 性能测试
|
||
<img src="data:image/png;base64,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%0AAagFXrG80XZcHD5JAjUT6agxJVJDIlUI0emQmVo6LNdm3tf4OqZQoL98QYPN%0Aoi4ZEr++YGFUNFBSisxnyrB5seWkVjbaJiPWmtpB+wxj2avV5s3LNth6h34o%0A1F6xpEHlqboIrj/NQSqWNlrx4AVhuXlxgykemm3HUzyopoLw2LSwvjmcxAPl%0Ax0icIwGmrZZUW8z9H5U21nqnc0ptO9T2xEmLzqOjxpRIjbhnE0vDB9dvMq//%0AcL1555cboiu9+EVkqenJe3kEFeFPFuLEKKRdvmTLNigF8+7VG83CJ6vavN22%0AwIrpk/s22/PgLC8dtd1PH6hI+/cRoqvoTZ/zqB6kcx3xd46NUbGI0CNJJNEE%0ATykgkimpG7xpQWNMONiM6NdqbOvKfhO31LTsiH2G0WdsnsnvnWVWvVdjWxs6%0AEM8cy8Z5DTY7u1AiNe0gGvvukG/d6HQBcgsaxsua6H1q3ew6039Cc3m/eBCy%0A0WtMjlk9rc5UrthyjQkrWfpytW0JTpmotsA25j1caf+eEBWofVRKMKPpqDEl%0AUiPpXxfdEFhNutZtfrhgGz/pmE4IlFqa+0CV2eWi4M5MWzvJ9AQXorvRa2Su%0AGXZggS3PxIK330751nW27sN6W2qNVr/emoEs4Ja9VGMLotMaGHid99GecPad%0Am22/84K+ObG6waOOLLT7aes+UwEr2+ivFNks/unXlZsBu+XZNsTuWAbunm/3%0ALddt19B3fHPbbq79xvnNNUcpF7Z+Tp1tgGK7BnliMYLGGy7eEYcX2Ra6s27Z%0AbK8x42XNzFprTRt7ckmbFzmUKCuPLrRoqz13SqWrYNUCtk1TCY5DdD0dMaZE%0AaiTXFrWgOcZr46cNZvDeEVvA2I8TsQX9skzt+nYmCkS676SebE9wIbobiDX6%0AXdMVip7kTN7coCnhNOqIIlskOxnIlN/5gjKz5IVqs3ZmvWmoqrduuPFnlNis%0Aeq8o7Kh9Bn6f6M2IG0/xoBxb1xJrG8k0HMu4U4ujIlU1LrsSkte2/2aJKRmR%0Aa1ZOrTFLX6ix8aO0Mx1+SGHSwo921Dt/r9Qsff6La9zYXKea+NE+Y1t3i0oG%0APGnlnzUbdRqqIqaiKri2GlvuyAoCon101JgSyZOUSC0enG1KR+VGbwh1pmZt%0Ao+3I4od4DBiwc4F1dYnWpNITXIjuCKIRFziPRNCSlEcQiMtxp5RGHx27Tz+U%0Amdr3qj7h244KFARLWFtD0bWwSBgRFQ88EhFvvJWNyDM7nZ36Naar2e4BZco4%0Arh3PLIs+Ut6k6GI6aky15X0sinuaRTZpdz+xW6wiiTX1i1RWhQiv3tvn2haE%0AQWBBxMW27OUa2zqQzNt+O+aZkUcUWcsDkz3bmTulwqyZ3hyLOuvmzfZf3P7e%0Asg6IvUVPV5t1HzUnLNjtHFloJxIvuNXp/oIFBfegs3KMOKzQugn9br6a9Y1b%0ArDM1Tab/hHwzYlLrgcg5cMcWjxGHF8YGnr8neNnoXPPxnRUJtyGEEEII0RNJ%0AWqQWD8mxro1N8xvMkP1auvwRd7Qi3ObrRaaptvVnbZHiR6psFw2y3xBvkQZj%0A43pm/rncxvXgfqPwNv3pKe2x/uMGM3iffBs3hjnddZdb80GtDVomoH14VEAi%0AWLHwli9uMBPOLTNlX8Sjkb275MUas/i5KmuCJ1YkJ3rMxIvNua/SDN4732x3%0A4pYuMWRZzr6rwtRubLIClnqMCNyZt5Tbgs4lQ7e4BSk3UjoqsZvQX6Mx2Z7g%0AQgghhBA9naRFKgIPS+nSl2paufw3L24uoN17TJ7Z8GnLrH4y3+iggUAd87Ui%0AM/LQwljMGEkO8x+uMouerTalI3Osa23Ivlgus74QqQU2kxecqENEImqH7NNc%0AqoPtr3q31syb0myldCKV7F2stgN3LbAtC12syOijC20cCYHPlLKhqwcWViyo%0AFN2ecF6ZjUGyx97Y3KKO93qh5EhQp5m45y+FnuBCCCGEED2dlKJ8nWD0lpfC%0ASmpd/dvmBnZuaaiOWLc8Vtih+7fMdEU4Dj2gICo8G63ATIb+O+WbgbttqSVH%0AmECvMbm23iG1ygBxue7D5lCA4Qe3DGbGxT/0gEIritd9XG/qK5piluBBe+ab%0APp5yIhyre68QQgghhEgfKRV4KxyQY3qNbunyp/PL5iUNZugpJYGlVijTUb22%0AyeTkGxsb6u+lXV8VscKx6vNG27klUVHkeN096qP7aqqP2MLItCgj4aswIEY2%0Av7RZ2FqRSmvE8ogtBI512P8d6B5BHKuSnIQQQggh0kdKIhVR2meHXOv+di5/%0Ayk7ll2WbkmHxN1W1qin6CM/6Jw41kkStfHqAhwlZSoNQrgOx6+8I4QUhmu0p%0ADeN67gbBvthn9Ahjz7UlcUoIIYQQQiRPyq0yKLWSlV1jhRqWVWqnUtA2vzS+%0ABZSi2dsdX5yWwtYIy/xe2aFClXCAJk/vXdcPPJn3Nm+/bYlTQgghhBAiOVIW%0AqXTAKPvC5V86osFsXtpghk8qDRWfuMtpZVi+qMHUVURMQe+W71v/SZ3ttjHi%0A0EIzYlLHJBbl5DULT9oS0rM739emjOPgeDgujg+IaaUf+MA9WpamIs6VHs1e%0A2pI4JYQQQgghkifl9giUbCIJipJPxJgiBon9DIM+tvSzrVjaaFa+WRPrdwv0%0ALl7yYrXNri8b49HLWc2WS0IA2gKCuf/O+fbv5a/XmPrKLftk/xwHx+P67CK8%0AqQNLP/ANn9TH+oFjRaV96cYFySV1CSGEEEKIjiFlSyo4l//6j+vN6GMKrdAL%0Ag+z7YQcUmcqVjTaWFSFI/2xXJxWX/Oijilv02y7qnxOVzxS/r7YWT2qopgpZ%0A+hTtp04qoQkDdsmP1Umlr3b/iXlmyH6F9vhy8rKsJXfzsgYz+56KqGDNNyXD%0Am+ukYkUt6KPsfiGEEEKIdNImkUohfeJQqWXad2x+wt7F9Moed2pJVBjWW8vm%0Asleq7fOI3XGTS2xdUldSCkqjgpVeuCum1tqapgjGkiGpCUWsqaOOKDRlo3PM%0A8ldqbAMAEqvKRuWa8WeWtOo4xXeaeG5ZdJ81ZuXbtWb9nDp7fDueVWo2RP8m%0AvEEIIYQQQqSHrIjzbX/BlClTzIxt7++q4xFChLDbwtP12xRpQ+NNtAeNH5Eq%0AjJnJkye3eC7lmFQhhBBCCCE6G4lUIYQQQgiRcUikCiGEEEKIjEMiVQghhBBC%0AZBwSqUIIIYQQIuOQSBVCCCGEEBmHRKoQQgghhMg4JFKFEEIIIUTGIZEqhBBC%0ACCEyDolUIYQQQgiRcQS2RRVCCCGEEKIraSVShRBCCCGE6Grk7hdCCCGEEBmH%0ARKoQQgghhMg4JFKFEEIIIUTG8f+pzvJvm2cEyAAAAABJRU5ErkJggg==" width="382px;" />
|
||
|
||
## 代码示例
|
||
|
||
#### 雪花漂移算法
|
||
```
|
||
var options = new IdGeneratorOptions()
|
||
{
|
||
// 设置WorkerId,默认最大2^16-1
|
||
WorkerId = 1
|
||
};
|
||
|
||
var newId = new YitIdGenerator(options).NewLong();
|
||
```
|
||
|
||
#### 传统雪花算法
|
||
```
|
||
var options = new IdGeneratorOptions()
|
||
{
|
||
Method = 2, // 默认1
|
||
WorkerId = 1
|
||
};
|
||
|
||
var newId = new YitIdGenerator(options).NewLong();
|
||
```
|
||
|
||
#### options说明
|
||
options参数(Method、StartTime除外)只支持漂移算法,不支持传统雪花算法。
|
||
|
||
```
|
||
public class IdGeneratorOptions
|
||
{
|
||
/// <summary>
|
||
/// 雪花计算方法
|
||
/// (1|2)
|
||
/// </summary>
|
||
public short Method { get; set; } = 1;
|
||
|
||
/// <summary>
|
||
/// 开始时间(UTC格式)
|
||
/// 不能超过当前系统时间
|
||
/// </summary>
|
||
public DateTime StartTime { get; set; } = DateTime.MinValue;
|
||
|
||
/// <summary>
|
||
/// 机器码
|
||
/// 与 WorkerIdBitLength 有关系
|
||
/// </summary>
|
||
public ushort WorkerId { get; set; } = 0;
|
||
|
||
/// <summary>
|
||
/// 机器码位长
|
||
/// 范围:2-21(要求:序列数位长+机器码位长不超过22)。
|
||
/// 建议范围:6-12。
|
||
/// </summary>
|
||
public byte WorkerIdBitLength { get; set; } = 6;
|
||
|
||
/// <summary>
|
||
/// 序列数位长
|
||
/// 范围:2-21(要求:序列数位长+机器码位长不超过22)。
|
||
/// 建议范围:6-14。
|
||
/// </summary>
|
||
public byte SeqBitLength { get; set; } = 6;
|
||
|
||
/// <summary>
|
||
/// 最大序列数(含)
|
||
/// (由SeqBitLength计算的最大值)
|
||
/// </summary>
|
||
public int MaxSeqNumber { get; set; } = 0;
|
||
|
||
/// <summary>
|
||
/// 最小序列数(含)
|
||
/// 默认11,不小于5,不大于MaxSeqNumber-2
|
||
/// </summary>
|
||
public ushort MinSeqNumber { get; set; } = 11;
|
||
|
||
/// <summary>
|
||
/// 最大漂移次数(含),
|
||
/// 默认2000,推荐范围500-10000(与计算能力有关)
|
||
/// </summary>
|
||
public int TopOverCostCount { get; set; } = 2000;
|
||
```
|
||
|
||
## 生成的ID
|
||
|
||
默认配置:
|
||
```
|
||
WorkerId = 6 (最多64个工作节点)
|
||
SeqBitLength = 6
|
||
```
|
||
|
||
ID示例:
|
||
```
|
||
129053495681099 (默认配置运行运行1年)
|
||
387750301904971 (默认配置运行运行3年)
|
||
646093214093387 (默认配置运行运行5年)
|
||
9007199254740992 (js Number 最大值)
|
||
```
|
||
|
||
## 技术支持
|
||
|
||
开源地址:https://gitee.com/yitter/idgenerator
|
||
|
||
QQ群:646049993
|
||
|