目录

简介

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

.NET 分布式自增Id组件(解决自动分配机器Id、时间回拨问题)的更多相关文章

  1. 利用Redis实现集群或开发环境下SnowFlake自动配置机器号

    前言: SnowFlake 雪花ID 算法是推特公司推出的著名分布式ID生成算法.利用预先分配好的机器ID,工作区ID,机器时间可以生成全局唯一的随时间趋势递增的Long类型ID.长度在17-19位. ...

  2. Twitter的分布式自增ID算法snowflake (Java版)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  3. 基于.NET Standard的分布式自增ID算法--美团点评LeafSegment

    概述 前一篇文章讲述了最流行的分布式ID生成算法snowflake,本篇文章根据美团点评分布式ID生成系统文章,介绍另一种相对更容易理解和编写的分布式ID生成方式. 实现原理 Leaf这个名字是来自德 ...

  4. Twitter的分布式自增ID算法snowflake(雪花算法) - C#版

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的.有些时候我们希望能使用一种简 ...

  5. 分布式自增ID算法snowflake (Java版)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  6. C# 分布式自增ID算法snowflake(雪花算法)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的.有些时候我们希望能使用一种简 ...

  7. 一秒可生成500万ID的分布式自增ID算法—雪花算法 (Snowflake,Delphi 版)

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  8. SnowflakeId雪花ID算法,分布式自增ID应用

    概述 snowflake是Twitter开源的分布式ID生成算法,结果是一个Long型的ID.其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器I ...

  9. Twitter分布式自增ID算法snowflake原理解析

    以JAVA为例 Twitter分布式自增ID算法snowflake,生成的是Long类型的id,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特(0和1). 那么一个 ...

随机推荐

  1. LR有的JMeter也有之三“集合点”

    继续上两篇的文章内容和思路进行.(文思如尿崩,谁与我争锋----韩寒)哈哈! 集合点:简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念 ...

  2. NS3中一些难以理解的常数

    摘要:在NS3的学习中,PHY MAC中总有一些常数,需要理解才能修改.如帧间间隔等.那么,本文做个简单分析,帮助大家理解.针对802.11标准中MAC协议.   void WifiMac::Conf ...

  3. java并发编程(二十六)----ThreadLocal的使用

    其实ThreadLocal很多接触过多线程的同学都可能会很陌生,他不像current包里面那些耳熟能详的api一样在我们面前经常出现,更多的他作为一个本地类出现在系统设计里面.我们可以说一下Sprin ...

  4. jvisualvm/Jconsole监控WAS中间件

    1.登录was控制台https://196.168.119.18:9043/ibm/console/,找到自己的应用程序服务器---java和进程管理---进程定义--JAVA虚拟机,然后配置 通用J ...

  5. 原生JavaScript(js)手把手教你写轮播图插件(banner)

    ---恢复内容开始--- 1.轮播图插件 1.什么是插件: 为已有的程序增加功能 2.插件的特点(为什么要做成一个插件)与注意事项: 1.通用性,可移植性强 2.兼容性:不会对其他代码产生影响 3.创 ...

  6. oracle常规使用(一)

    目录 特殊sql distinct 项目中遇到表中无主键,但是某个字段不能重复. 需要匹配id串里的内容 批量更新,但是批量成功返回的是-1 时间格式化 行列互转 应用场景 列转行 总结 oracle ...

  7. 阿里架构师浅析Java设计模式之虚拟代理模式

    虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成,应用启动 ...

  8. HlpViewer.exe 单独打开

    1.在桌面新建一个快捷键 2.添加HlpViewer.exe 的本地地址 3.在添加的地址后面添加 /catalogName VisualStudio12 4.保存快捷键即可 列: 桌面右键-> ...

  9. 12-Factor,构建原生软件应用方法论

    官方地址:https://12factor.net/zh_cn/ 原则1:一份基准代码,多份部署 这个原则不管对微服务模式还是其他软件开发模式来说都非常基本,所以被列为12原则的第一条,该原则包括如下 ...

  10. 登录cookies

    cookie Cookie 是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话./p> cookie ...