Ted's Blog



浅聊一下分布式ID生成服务

1、背景

在复杂的分布式系统中需要大量的唯一标识,如在订单、消息推送、支付、调度、费用等系统中都有需要,在数据日渐增长中数据库自增ID将无法满足庞大数据唯一标识的支撑,因此需要一套可以生成全局唯一标识ID的系统。

需要满足的条件

  1. 全局唯一性:不能出现重复的ID,这是最基础的要求

  2. 趋势递增:ID多数时会被定义为主键或唯一索引,要利于索引检索提高性能

  3. 单调递增:保证下一个ID要大于上一个ID

  4. 信息安全:需要ID无规则、不规则,因为ID连续会被轻易的恶意抓取 或 通过ID评估一定时间区间内订单量

上述1、2、3对应不同场景,3和4需求互斥无法满足同一方案

不仅要对ID自身有要求,对ID生成系统的可靠性也是有严格的要求的,假如ID生成系统宕机了,那么对该系统所依赖的所有系统都将挂掉,这将是灾难性的事故。

由此对ID生成系统可靠性的总结

  1. 平均延迟和TP999都要尽可能的低

    1. TP(top percentile) 统计学中的术语 与平均数、中位数都是一类。

    2. TP90就是满足百分之九十的网络请求所需要的最低耗时。

    3. TP99就是满足百分之九十九的网络请求所需要的最低耗时。

    4. TP999就是满足千分之九百九十九的网络请求所需要的最低耗时

  2. 可用性5个9(点击查看介绍)(99.999%)

  3. 高QPS

2、常见方法介绍

UUID

UUID (Universally Unique Identifier) 通用唯一编码,其标准形式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有5种方式生成UUID

优点
  1. 性能非常高:本地生成,无网络消耗

缺点
  • 不易于存储:UUID太长,通常以36长度字符串表示,很多场景不适用

  • 信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄漏,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置

  • ID作为主键会有一些问题,比如做DB主键的场景下,UUID就不太适合

    • MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求

    • 对MySQL索引不利:如果作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。

snowflake方案

算法描述
  • 最高位是符号位,始终为0,不可用

  • 41位的时间序列,精确到毫秒可使用69年 ,(1<<41)/ (3600*24*365*1000) ≈ 69

  • 10位的机器标识,10位长度最多支持部署1024个节点

  • 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生2^12≈4096个ID序号

优点
  • 毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。

  • 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。

  • 可以根据自身业务特性分配bit位,非常灵活。

缺点
  • 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。

  • 生成的ID取模后可能不均匀

数据库生成

  • 数据库生成是通过数据库自增ID生成唯一标识。优点是简单易用,缺点是对数据库性能有影响,且无法满足分布式系统的需求。

  • 为了提高性能和可扩展性,可以引入分库分表策略,将ID生成分散到多个数据库实例。

Redis生成

  • Redis生成是利用Redis的原子操作来生成唯一标识。为了提高可靠性,可以采用Redis集群或主从复制等方式,确保当某个Redis实例出现问题时,其他实例仍然可以继续提供服务。

区块链技术生成ID(GPT4模型提供的新颖的ID生成方案)

优点
  • 唯一性和不可篡改性:区块链技术具有不可篡改的特性,可以确保生成的ID具有全局唯一性,避免了ID重复的问题。

  • 安全性:区块链采用分布式共识算法,提高了数据的安全性。攻击者很难篡改数据,除非控制了网络中的大部分节点。

  • 去中心化:区块链技术采用去中心化的方式进行数据存储,降低了单点故障的风险,提高了系统的容错能力。

  • 可扩展性:基于智能合约的ID生成方案可以灵活地扩展和升级,以满足不同场景和业务需求。

缺点
  • 性能:相较于传统的集中式ID生成方案,区块链技术在性能方面可能较低,因为它需要多个节点达成共识才能生成新的ID。这可能导致ID生成速度较慢,不适合高并发场景。

  • 复杂性:区块链技术相对复杂,实现和维护成本较高。对于一些小型应用或简单场景,这种ID生成方案可能不是最优选择。

  • 能耗:部分区块链技术采用工作量证明(Proof of Work,PoW)共识机制,这种机制会消耗大量的计算资源和能源。虽然新的共识机制(如权益证明,Proof of Stake,PoS)在能耗方面有所改进,但整体能耗仍然较高。

  • 成本:部署和维护区块链网络需要投入一定的资源和成本,可能不适合所有场景和应用。


github项目


分享:

写评论


Contact ME

github:https://github.com/tebie6

email:liumingyuphp@163.com

友情链接

无敌我大鑫哥:http://dream128.cn