改进版 .NET 雪花算法组件

91ff2cabb7620a4756a86788e20d573e.png

a5487e9f6cf7191ddbc77063d09b43f2.gif

211b70787a6cd1071fb1ab3ae1cd6d63.png

欢迎来到 Dotnet 工具箱!在这里,你可以发现各种令人惊喜的开源项目!

公众号内回复 上海找工作 

获取 2023 上海 .NET 公司列表。

雪花算法

ClockSnowFlake 是 一个基于.NET开源的改进版雪花算法组件,这个库主要解决了原生雪花算法的时间回拨问题。

ClockSnowFlake 傻瓜式配置,开箱即用,支持自定义 WorkId。

如何使用?

1.通过 Nuget 安装 ClockSnowFlake。

Install-Package ClockSnowFlake

2.修改 Startup.cs

public class Startup
{
    //...
    
    public void ConfigureServices(IServiceCollection services)
    {
        //configuration
        services.AddSnowFlakeId(x => x.WorkId = 2);
    }    
}

3.使用 IdGener 生成 Id

[ApiController]
[Route("[controller]/[action]")]
public class SnowFlakeController : ControllerBase
{
    /// <summary>
    /// 获取Id
    /// </summary>
    [HttpGet]
    public long GetId()
    {
        return IdGener.GetLong();
    }
}

雪花算法的时间回拨问题

简单说就是时间被调整回到了之前的时间,由于雪花算法重度依赖机器的当前时间,所以一旦发生时间回拨,将有可能导致生成的 ID 可能与此前已经生成的某个 ID 重复(前提是刚好在同一毫秒生成 ID 时序列号也刚好一致),这就是雪花算法最经常讨论的问题。

这个现象发生的原因可能有,网络时间校准、人工设置错误、出现负闰秒等。

在原生的雪花算法中,出现时间回拨问题后,会支持抛出异常,由应用来处理错误, 如果是在一个并发不高或者请求量不大的业务系统中,错误等待或者重试的策略问题不大,但是如果是在一个高并发的系统中,这种策略显得过于粗暴。

如何解决?

这里采用的是一种基于修改扩展位的思路,基于时钟序列的雪花算法 二进制64位长整型数字:1bit保留 + 41bit时间戳 + 3位时钟序列 + 7bit机器 + 12bit序列号。

192cf4106e40fe11b1a7b5e7b67efc8a.png

如上图,将原本10位的机器码拆分成3位时钟序列及7位机器码,发生时间回拨的时候,时间已经发生了变化,那么这时将时钟序列新增1位,重新定义整个雪花Id 为了避免实例重启引起时间序列丢失,因此时钟序列最好通过DB/缓存等方式存储起来。

往期推荐:

功能强大,基于 .NET 实现的分布式锁

一行代码,监控 C# 方法执行耗时

Sejil - 开箱即用的 .NET 日志管理组件

CsGo - C#并发流程控制框架,单线程调度每秒100万次以上

C# 开发的高速 .NET 模板引擎

项目地址

https://github.com/Bryan-Cyf/ClockSnowFlake

公众号内回复 上海找工作 

获取 2023 上海 .NET 公司列表。

6bdf2567fa11b49bdecc60fd80981413.png

65685e91a454bca69ead915b37a2f0b2.png

分享

6fbefa6767c68f186563c88ccbaa0228.png

点收藏 

7f3a2ebabf26191531566048c9074465.png

点点赞

aaed13b36f2c45858e05daf031565974.png

点在看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值