目录

简介

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