.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
上一篇: 库存压力太大:电视厂商将选择降价换销量
下一篇: C# 控制台定时器