常用的分布式 ID 设计方案

文章目录

  • 1.UUID
  • [2.数据库自增 ID](#2.数据库自增 ID)
  • 3.雪花算法
  • [4.Redis 生成 ID](#4.Redis 生成 ID)
  • [5.美团 Leaf](#5.美团 Leaf)

1.UUID

原理:UUID 是由数字和字母组成的 128 位标识符,通过特定算法随机生成,包括时间戳、计算机网卡地址等信息。常见的版本有版本 1(基于时间戳和 MAC 地址)、版本 4(纯随机数)等。

优点:

  • 生成简单,本地生成,不需要依赖额外的组件或服务,能有效减少网络开销。
  • 全球唯一,基本能保证在任何场景下不会重复。

缺点:

  • 长度较长,通常为 36 个字符(如550e8400-e29b-41d4-a716-446655440000),占用存储空间大,在数据库存储和传输时会增加开销。
  • 无序性,导致在数据库索引中效率较低,不利于排序和分页操作。

2.数据库自增 ID

原理:利用关系型数据库(如 MySQL)的自增字段特性,每插入一条数据,ID 自动递增。可以单库单表生成,也可以分库分表生成(如设置不同的初始值和步长) 。

优点

  • 简单直观,符合人们对 ID 的认知习惯,容易理解和使用。
  • 有序性,方便进行排序、分页和统计等操作。

缺点

  • 性能瓶颈,在高并发场景下,数据库的写操作会成为性能瓶颈,因为自增 ID 的生成依赖数据库的锁机制。
  • 扩展性差,分库分表时,ID 的生成和管理会变得复杂,需要额外的逻辑来保证唯一性。

3.雪花算法

原理:由 Twitter 开源,是一种生成 64 位整数 ID 的算法。它将 64 位划分为不同部分,包含 1 位符号位(固定为 0)、41 位时间戳(毫秒级)、10 位工作机器 ID(可支持 1024 个节点)和 12 位序列号(同一毫秒内生成不同 ID)。

优点

  • 高性能,在内存中生成,不依赖数据库等外部组件,生成速度快,能满足高并发场景。
  • 有序性,根据时间戳生成,基本保证 ID 是有序的,有利于数据库索引和排序。
  • 可扩展性,通过调整工作机器 ID 位数,可以适应不同规模的分布式系统。

缺点

  • 强依赖时钟,若服务器时钟回拨,可能会生成重复 ID,需要额外的处理逻辑。
  • 实现相对复杂,需要对算法原理有一定了解才能正确实现和维护。

4.Redis 生成 ID

原理:利用 Redis 的INCR或INCRBY命令,以原子操作的方式递增一个键的值,以此作为 ID。也可以结合时间戳等信息生成更有意义的 ID。

优点

  • 性能高,Redis 基于内存操作,处理速度快,能应对高并发的 ID 生成需求。
  • 可扩展性好,Redis 本身支持集群部署,可以方便地扩展以满足更大规模的系统需求。

缺点

  • 依赖外部组件,若 Redis 出现故障,会影响 ID 的生成。
  • 没有内置的时间顺序性,如果需要有序 ID,需要额外处理。

5.美团 Leaf

原理:美团开源的分布式 ID 生成系统,支持两种模式。一是 "雪花算法" 模式,适用于强依赖 ID 有序性的场景;二是 "segment(号段)" 模式,服务端一次性分配一个号段给客户端,客户端在号段内自行生成 ID,用完后再向服务端申请新号段。

优点

  • 灵活性高,可根据不同业务场景选择不同模式,满足多样化的需求。
  • 高性能,"segment" 模式下,客户端在本地生成 ID,减少了与服务端的交互,提高了性能。

缺点

  • 实现相对复杂,需要搭建和维护 Leaf 服务。
  • 在 "segment" 模式下,如果号段设置不合理,可能会导致号段浪费或不足的情况。
相关推荐
IvanCodes5 小时前
五、Hadoop集群部署:从零搭建三节点Hadoop环境(保姆级教程)
大数据·hadoop·分布式
Panesle7 小时前
分布式异步强化学习框架训练32B大模型:INTELLECT-2
人工智能·分布式·深度学习·算法·大模型
计算机毕设定制辅导-无忧学长8 小时前
RabbitMQ 核心概念与消息模型深度解析(一)
分布式·rabbitmq
信徒_11 小时前
Kafka topic 中的 partition 数据倾斜问题
分布式·kafka
Paraverse_徐志斌11 小时前
Kafka 如何保证消息顺序性
分布式·中间件·kafka·消息队列
我叫珂蛋儿吖13 小时前
[redis进阶六]详解redis作为缓存&&分布式锁
运维·c语言·数据库·c++·redis·分布式·缓存
椰椰椰耶14 小时前
【RabbitMQ】工作队列和发布/订阅模式的具体实现
分布式·rabbitmq·ruby
猪猪果泡酒15 小时前
Spark,RDD中的行动算子
大数据·分布式·spark
2401_8712905816 小时前
Spark处理过程-转换算子
大数据·分布式·spark
Betty_蹄蹄boo16 小时前
运行Spark程序-在Spark-shell——RDD
大数据·分布式·spark