.NET集成IdGenerator生成分布式ID

前言

生成分布式ID的方式有很多种如常见的有UUID、Snowflake(雪花算法)、数据库自增ID、Redis等等,今天我们来讲讲.NET集成IdGenerator生成分布式ID。

分布式ID是什么?

分布式ID是一种在分布式系统中生成唯一标识符的方法,用于解决多个节点之间标识符重复或性能问题。

分布式ID需要满足的条件

  • 全局唯一性:分布式ID在整个分布式系统中必须是唯一的,不同节点生成的ID不能重复。
  • 高性能:生成分布式ID的算法或机制应该具有高效的性能,能够在大规模的分布式环境下迅速生成ID。
  • 高可用 :生成分布式ID的服务要保证可用性无限接近于100%。
  • 方便易用 :拿来即用,使用方便,快速接入。
  • 压缩性:分布式ID应该尽可能地使用较少的存储空间,减少对网络传输和存储的负载。

IdGenerator介绍

IdGenerator是一个全面的分布式主键ID生成器,使用的是优化的雪花算法(SnowFlake)雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。

  • 这是优化的雪花算法(雪花漂移),它生成的ID更短、速度更快。
  • 支持 k8s 等容器环境自动扩容(自动注册 WorkerId),可在单机或分布式环境生成数字型唯一ID。
  • 原生支持 C#/Java/Go/Rust/C/SQL/Node.js/PHP(C扩展) 等语言,并提供Python、PB多线程安全调用动态库(FFI)。
  • 兼容所有雪花算法(号段模式或经典模式,大厂或小厂),将来你可做任意的升级切换。(一般无须升级,但理论上支持)。

C# IdGenerator支持环境

  • .NET Standard 2.0+ (支持:.net framework4.6.1+/.net core 2.0+/.net5/.net6+/mono5.4+/Unity 2018+/Xamarin)。

性能数据

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

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

💍 极致性能:500W/s~3000W/s。(所有测试数据均基于8代低压i7计算)

如何处理时间回拨

  • 当发生系统时间回拨时,算法采用过去时序的预留序数生成新的ID。
  • 回拨生成的ID序号,默认靠前,也可以调整为靠后。
  • 允许时间回拨至本算法预设基数(参数可调)。

.NET集成IdGenerator

创建IdGeneratorTest控制台

引入IdGenerator Nuget包

Nuget包搜索:IdGenerator

程序调用示例

csharp 复制代码
using Yitter.IdGenerator;

namespace IdGeneratorTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region 第一步:全局初始化(应用程序启动时执行一次)

            // 创建 IdGeneratorOptions 对象,可在构造函数中输入 WorkerId:
            // options.WorkerIdBitLength = 10; // 默认值6,限定 WorkerId 最大值为2^6-1,即默认最多支持64个节点。
            // options.SeqBitLength = 6; // 默认值6,限制每毫秒生成的ID个数。若生成速度超过5万个/秒,建议加大 SeqBitLength 到 10。
            // options.BaseTime = Your_Base_Time; // 如果要兼容老系统的雪花算法,此处应设置为老系统的BaseTime。
            // WorkerId:WorkerId,机器码,最重要参数,无默认值,必须 全局唯一(或相同 DataCenterId 内唯一),必须 程序设定,缺省条件(WorkerIdBitLength取默认值)时最大值63,理论最大值 2^WorkerIdBitLength-1(不同实现语言可能会限定在 65535 或 32767,原理同 WorkerIdBitLength 规则)。不同机器或不同应用实例 不能相同,你可通过应用程序配置该值,也可通过调用外部服务获取值。
            // ...... 其它参数参考 IdGeneratorOptions 定义。
            var idGeneratorOptions = new IdGeneratorOptions(1) { WorkerIdBitLength = 6 };
            // 保存参数(务必调用,否则参数设置不生效):
            YitIdHelper.SetIdGenerator(idGeneratorOptions);
            // 以上过程只需全局一次,且应在生成ID之前完成。

            #endregion

            #region 第二步:生成分布式ID

            for (int i = 0; i < 1000; i++)
            {
                // 初始化后,在任何需要生成ID的地方,调用以下方法:
                var newId = YitIdHelper.NextId();
                Console.WriteLine($"Number{i},{newId}");
            }

            #endregion
        }
    }
}
相关推荐
神奇小汤圆3 小时前
国产版“Codex”初体验,智谱ZCode很强啊!
后端
站大爷IP3 小时前
Python里的“赋值”到底是什么意思?
后端
鹅城剑仙4 小时前
Spring Boot 微服务架构设计与最佳实践
spring boot·后端·微服务
Full Stack Developme5 小时前
Spring Integration 教程
java·后端·spring
爱勇宝5 小时前
AI 时代,前端工程师的话语权正在下降?
前端·后端
kymjs张涛5 小时前
一个月,纯VibeCoding,全平台云笔记APP
前端·javascript·后端
星辰_mya5 小时前
autowired和resource区别
java·后端·spring·架构·原理
用户019027581615 小时前
用 Python + backtrader 做专业级策略回测
后端
lazy_ma5 小时前
大模型实操-Spring Boot集成LangChain4j
人工智能·后端
狗头大军之江苏分军5 小时前
前端路由是怎么来的
前端·javascript·后端