.NET 分布式自增Id组件(解决自动分配机器Id、时间回拨问题)
目录
简介
IdHelper是一个.NET(支持.NET45+或.NET Standard2+)生成分布式趋势自增Id组件,有两个版本:原始版为基于雪花Id(不了解请自行百度)方案,需要手动管理设置WorkerId;完美版在原始版的基础上使用Zookeeper来解决原始版中的WorkerId的分配问题和时间回拨问题。
原始版安装方式:Nuget安装IdHelper即可
完美版安装方式:Nuget安装IdHelper.Zookeeper即可
请按需选择,强烈推荐完美版
项目地址:https://github.com/Coldairarrow/IdHelper
产生背景
分布式趋势自增Id的生成方案比较多,其中雪花Id是比较常用的,但是雪花Id及其依赖WorkerId的分配和机器时钟。WorkerId分配问题:传统雪花Id是需要分配数据中心Id和机器Id(即WorkerId),我为了使用方便(项目比较小),用不到数据中心Id,就把数据中心Id去掉并补充到机器Id,使机器Id可分配范围为1~1023,每个服务机器Id不能重复,若手工去为每个服务设置无疑十分麻烦还容易搞错(其实是懒)。时钟回拨问题:由于强依赖机器时钟,因此当时间回拨时将发生灾难性问题,虽然这种概率很小,但是实际存在。为了解决上述两个问题,本组件应运而生。
使用方式
原始版
Nuget安装包:IdHelper
刚出炉的包,排名比较靠后,请认准作者:Coldairarrow
using Coldairarrow.Util;
using System;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
new IdHelperBootstrapper()
//设置WorkerId
.SetWorkderId(1)
.Boot();
Console.WriteLine($"WorkerId:{IdHelper.WorkerId},Id:{IdHelper.GetId()}");
Console.ReadLine();
}
}
}
完美版
1:安装并配置JAVA环境(Zookeeper需要用JAVA) 教程:连接
2:安装并启动Zookeeper,教程:链接
3:Nuget安装包:IdHelper.Zookeeper
using Coldairarrow.Util;
using System;
namespace Demo.Zookeeper
{
class Program
{
static void Main(string[] args)
{
new IdHelperBootstrapper()
//使用Zookeeper自动分配管理WorkerId,解决时间回退问题和自动分配问题
.UseZookeeper("127.0.0.1:2181", 200, "Test")
.Boot();
Console.WriteLine($"WorkerId:{IdHelper.WorkerId},Id:{IdHelper.GetId()}");
Console.ReadLine();
}
}
}
测试
using Coldairarrow.Util;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace Demo.Test
{
class Program
{
static void Main(string[] args)
{
string conString = "127.0.0.1:2181";
new IdHelperBootstrapper()
.UseZookeeper(conString, 200, "Test")
.Boot();
Console.WriteLine($"WorkerId:{IdHelper.WorkerId}");
Stopwatch watch = new Stopwatch();
watch.Start();
List<Task> tasks = new List<Task>();
BlockingCollection<string> ids = new BlockingCollection<string>();
for (int i = 0; i < 4; i++)
{
tasks.Add(Task.Run(() =>
{
for (int j = 0; j < 1000000; j++)
{
ids.Add(IdHelper.GetId());
}
}));
}
Task.WaitAll(tasks.ToArray());
watch.Stop();
Console.WriteLine($"耗时:{watch.ElapsedMilliseconds}ms,是否有重复:{ids.Count != ids.Distinct().Count()}");
}
}
}
结尾
以上所有示例在源码中都有,若觉得不错请点赞加星星,希望能够帮助到大家。
有任何问题请及时反馈或加群交流
QQ群1:(已满)
QQ群2:579202910
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?