背景

分布式 ID (Distributed ID)是指在分布式系统中,为了保证全局唯一性而生成的一类 ID。在分布式系统中,由于存在多个节点同时生成 ID 的情况,因此需要采用一定的算法来保证生成的ID的唯一性和连续性。

常见的分布式 ID 生成算法有 UUID、Snowflake、Twitter 的雪花算法等。这些算法的实现方式各不相同,但通常都需要依赖于一些分布式协调工具(如 Zookeeper、Etcd 等)来实现节点之间的协调和同步。分布式 ID 在分布式系统中具有重要的作用,可以用于唯一标识分布式系统中的各种实体,如订单、用户等。同时,分布式 ID 的生成速度也对系统的性能有一定的影响,因此需要选择合适的算法和实现方式来满足系统的需求。

Leaf-segment 是美团点评开源的一种分布式 ID 生成方案,是 Leaf 系统的一部分。与 Leaf 的Snowflake 算法不同,Leaf-segment 采用了基于数据库的分段算法,可以在不依赖于特定硬件和时钟同步的情况下生成全局唯一的 ID。

具体来说,Leaf-segment 将 ID 的生成分为两个步骤:

  1. 申请 ID 段:首先,客户端向 Leaf-segment 服务端申请一个 ID 段,包含起始 ID 和结束 ID。

  2. 生成 ID:客户端在本地缓存中维护当前 ID 段的起始 ID 和结束 ID,每次生成 ID 时,先检查本地缓存中的 ID 是否用尽,如果用尽,则重新向 Leaf-segment 服务端申请一个新的 ID 段。

Leaf-segment 的优点包括:

  1. 独立性:Leaf-segment 不依赖于特定硬件和时钟同步,可以在任何环境下生成全局唯一的  ID。

  2. 可扩展性:Leaf-segment 采用了分段算法,可以根据实际需求动态调整 ID 段的大小,支持高并发场景下的 ID 生成。

  3. 可以自定义 max_id(号段) 的大小,非常方便业务从原有的 ID 方式上迁移过来。

总之,Leaf-segment 是一种非常优秀的分布式 ID 生成方案,可以帮助开发人员快速解决分布式 ID 生成的问题,提高系统的性能和可用性。

数据库表设计(以 MySQL 为例)

  • max_id:当前业务号段的最大值,用于计算下一个号段。
  • step:每次分配的号段长度,初始是 0~1000 的号段,当这个号段用完时,max_id 会从 1000 被更新成 2000(max_id = max_id + step),该值的大小决定更新 max_id 的频率。
  • time:更新号段的时间。
CREATE TABLE IF NOT EXISTS leaf_segment
(`max_id` BIGINT NOT NULL,`step`   INT    NOT NULL,`time`   TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

  • 创建表之后,添加一条初始化数据。
INSERT INTO leaf_segment(`max_id`, `step`) SELECT 0, 1000 FROM DUAL WHERE NOT EXISTS(SELECT * FROM leaf_segment);
  • 更新号段的语句。
Begin
UPDATE leaf_segment SET max_id = max_id + step
SELECT max_id, step FROM leaf_segment
Commit

创建实体类

/// <summary>
/// 存储 Leaf 生成 Id 的号段。
/// </summary>
internal class LeafSegment
{/// <summary>/// 被分配的号段的最大值。/// </summary>internal long MaxId { get; set; }/// <summary>/// 每次分配的号段长度。/// 初始是 0~1000 的号段,当这个号段用完时,MaxId 会从 1000 被更新成 2000(MaxId = MaxId + Step)。/// 该值的大小决定更新 MaxId 的频率。/// </summary>internal int Step { get; set; }/// <summary>/// 更新时间。/// </summary>internal System.DateTime Time { get; set; }
}

生成 ID

long IIdGenerator.Generation(out long previouId)
{if (!_init){LogUtil.Error(LogTag, "LeafIdGenerator 未初始化成功。");throw new SystemException("LeafIdGenerator 未初始化成功。");}while (true){_segmentBuffer.Lock.EnterReadLock();try{var segment = _segmentBuffer.Current;// 检查下号段是否只剩下 10%。if (!_segmentBuffer.IsNextReady && segment.Surplus < 0.1 * segment.Step && _segmentBuffer.AtomicBoolean.CompareAndSet(false, true)){_segmentBuffer.Task = Task.Run(OpenSegmentBuffer);}var result = Interlocked.Increment(ref segment._value);// 如果生成的号段未超出就直接返回。if (result < segment.MaxId){previouId = Interlocked.Exchange(ref _previouId, result);return result;}}catch{throw;}finally{// 释放读锁。_segmentBuffer.Lock.ExitReadLock();}//LogUtil.Debug(LogTag, $"等待异步更新。");_segmentBuffer.Task?.Wait();_segmentBuffer.Lock.EnterWriteLock();try{var segment = _segmentBuffer.Current;var result = Interlocked.Increment(ref segment._value);// 如果生成的号段未超出就直接返回。if (result < segment.MaxId){previouId = Interlocked.Exchange(ref _previouId, result);return result;}if (_segmentBuffer.IsNextReady){// 切换位置。_segmentBuffer.SwitchPos();_segmentBuffer.IsNextReady = false;//LogUtil.Debug(LogTag, $"切换号段完成。");}else{//LogUtil.Debug(LogTag, $"继续。");continue;}}catch{throw;}finally{_segmentBuffer.Lock.ExitWriteLock();}}
}

总结

以上就是在 .net 中实现 Leaf——美团点评分布式 ID 生成系统的介绍,具体源码可以从我的 GitHub 中拉取,如有任何问题请通过微信公众号私信我。

微信公众号:KeisoftCN

源码地址:https://github.com/macroecho/netLeaf

在 .NET6.0 中实现 Leaf-segment 分布式 ID 生成系统相关推荐

  1. 分布式 ID 生成系统 Leaf 的设计思路,源码解读

    什么是分布式ID? ID 最大的特点是 唯一 而分布式 ID,就是指分布式系统下的 ID,它是 全局唯一 的. 为啥需要分布式ID呢? 这就和 唯一 息息相关了. 比如我们用 MySQL 存储数据,一 ...

  2. Leaf-美团分布式id生成系统

    概述 分布式id生成已经有业界较为成熟的方案.现在公司使用的是美团的Leaf的号码段模式.之所以不用雪花算法模式还是因为雪花算法的自身缺陷,即时间回拨问题.本文就从源码角度剖析leaf项目的两种id生 ...

  3. 美团开源分布式ID生成系统——Leaf源码阅读笔记(Leaf的号段模式)

    Leaf 最早期需求是各个业务线的订单ID生成需求.在美团早期,有的业务直接通过DB自增的方式生成ID,有的业务通过redis缓存来生成ID,也有的业务直接用UUID这种方式来生成ID.以上的方式各自 ...

  4. 带你了解「美团、百度和滴滴」的分布式 ID 生成系统

    文章目录 美团 背景 常见方法介绍 UUID 类snowflake方案 数据库生成 Leaf 方案实现 Leaf-segment 数据库方案 双 buffer 优化 Leaf 高可用容灾 Leaf-s ...

  5. 滴滴开源的分布式id生成系统

    ID Generator id生成器 分布式id生成系统,简单易用.高性能.高可用的id生成系统 简介 Tinyid是用Java开发的一款分布式id生成系统,基于数据库号段算法实现,关于这个算法可以参 ...

  6. 【阅读】Leaf——美团点评分布式ID生成系统

    文章目录 背景 常见实现方案 UUID 优势 缺点 应用 类SnowFlake方案 优点 缺点 应用 数据库生成 优点 缺点 MySQL 增强版 优点 缺点 Leaf -segment方案 优点 缺点 ...

  7. Leaf——美团点评分布式ID生成系统

    背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数 ...

  8. [分布式id]:Leaf——美团点评分布式ID生成系统

    文章目录 摘要 1 分布式id相关概念 1.1 为什么需要分布式id 1.1.1 BTree 1.1.2 B+Tree 1.1.3 B+Tree相比于BTree优势 1.2 什么是分布式id 1.3 ...

  9. Leaf:美团分布式ID生成服务开源

    Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家.数学家莱布尼茨的一句话:"There are no two identical leaves in the wor ...

最新文章

  1. 获取手机当前显示的ViewController
  2. 003_推箱子-事件
  3. nextcloud php工程师,教你如何基于宝塔面板和nextcloud搭建自己的网盘
  4. Audirvana for Mac(高品质音乐播放器)
  5. LeetCode Palindrome Linked List (回文链表)
  6. JAVA中BigDecimal的字符化输出
  7. 英特尔开源计算机视觉数据标签工具CVAT,加速数据注释
  8. [转载]jQuery操作Table学习总结
  9. 项目搭建 windows_08. SpringCloud实战项目-配置Git
  10. DBA,六个灾难恢复等级你都知道吗?
  11. 运行JAR文件显示没有主清单属性
  12. 恶意代码检测理论(静态与动态分析基础)
  13. 什么思维是计算机科学的基础概念,计算思维基础
  14. 德州仪器发布99%高效GaN逆变器功率级的参考设计
  15. android短信过滤关键词,iOS 11的垃圾短信按关键词过滤功能使用介绍
  16. 前端打包之后 运用nginx反向代理运行项目
  17. 明略科技吴明辉:每一次新数据都会带来商业模式的迭代
  18. 【图解】共模干扰,差模干扰
  19. CPP全面总结(涵盖C++11标准)
  20. Leetcode494. 目标和

热门文章

  1. 【高等数学】多元函数积分的轮换性,轮换对称性,对称性的区别
  2. 《数据库概论》实验(2):交互式SQL--创建表《数据库概论》 实验(3)-交互式SQL--简单查询 《数据库概论》实验(4):交互式SQL--复杂查询
  3. 每天五分钟机器学习:模型效果不好怎么办?使用诊断方法解决问题
  4. NTC采样环境温度的计算方法
  5. mysql打不开 10061_mysql 10061报错,mysql 10061解决方法,10061问题,mysql学习,mysql启动
  6. Nginx日志时间默认为GMT时间,改为CST时间
  7. 一周 Go World 新鲜事-2018W50
  8. js获取剪切板内容(企业微信内嵌网页)
  9. 【Tableau】快速笔记
  10. 2019届各大互联网公司校招薪资曝光汇总