前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET集成IdGenerator生成分布式全局唯一ID

.NET集成IdGenerator生成分布式全局唯一ID

作者头像
追逐时光者
发布2024-01-25 08:39:17
4380
发布2024-01-25 08:39:17
举报
文章被收录于专栏:编程进阶实战

前言

生成分布式唯一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+/.net7+/.net8/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控制台

引入Yitter.IdGenerator NuGet包

搜索NuGet包:Yitter.IdGenerator。

程序调用示例

代码语言:javascript
复制
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
        }
    }
}

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

https://github.com/yitter/IdGenerator

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 分布式ID是什么?
  • 分布式ID需要满足的条件
  • IdGenerator介绍
  • C# IdGenerator支持环境
  • 性能数据
  • 如何处理时间回拨
  • .NET集成IdGenerator
    • 创建IdGeneratorTest控制台
      • 引入Yitter.IdGenerator NuGet包
        • 程序调用示例
        • 项目源码地址
        • 优秀项目和框架精选
        相关产品与服务
        云数据库 Redis®
        腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档