谈谈常用的分布式 ID 设计方案

常用的分布式 ID 设计方案有以下几种:

  1. 数据库自增 ID:

    • 优点:简单,天然有序。

    • 缺点:并发性不好,数据库写压力大,数据库故障后不可使用,存在数量泄露风险。

    • 优化方案:

      • 数据库水平拆分,设置不同的初始值和相同的自增步长。

      • 基于数据库的号段模式,即预先在数据库中生成一段 ID 号段,应用启动时获取该号段,当本地的号段快用完时,再去数据库获取新的号段。

  2. UUID:

    • 优点:简单易用,无需依赖中心化服务,生成速度快,适用于无需严格顺序的场景。

    • 缺点:UUID 比较长,占用存储空间大,不保证 ID 生成的有序性,可能会影响数据库索引效率。

  3. Snowflake 雪花算法:

    • 优点:高性能、分布式环境下无冲突,易于水平扩展,适用于大规模分布式系统,生成的 ID 是全局唯一的,且可以保证高效地生成,不依赖于集中式服务。

    • 缺点:时间戳位有一定的时钟回拨问题,需要预先分配机器 ID,可能会导致机器数目限制。

    • 变种与改进:

      • MongoDB ObjectId:使用 12 字节存储时间戳、机器 ID、进程 ID 和计数器,适用于非数值型 ID 场景。

      • 美团的 Leaf:支持号段模式和 Snowflake 模式,适应不同业务需求。

      • 百度的 UidGenerator:通过环形缓冲(Ring Buffer)提升吞吐量,解决高并发下性能问题。

  4. 基于 Redis 的 incr 命令:

    • 优点 :利用 Redis 的单线程模型来保证分布式 ID 的唯一性,而 INCR 命令则保证了分布式 ID 的有序性。

    • 实现方法:

      • 初始化数据,设置分布式 ID 的初始结构。

      • 对于单机模式下的 Redis,直接使用 INCR 命令即可保证有序性。

      • 对于集群模式下的 Redis,给每个节点设置不同的初始偏移量,并使用 INCRBY 命令指定集群中所有节点数量的步长来保证全局唯一性。

  5. Google 的 Spanner:

    • 优点:通过 TrueTime API 来保证全球时间的一致性,从而生成全局唯一的 ID。

    • 缺点:实现复杂,需要依赖于 Google 的基础设施,对于一般的分布式系统来说成本较高。

在选择分布式 ID 生成策略时,需要考虑性能要求、ID 有序性、存储与传输、分布式架构等因素。

相关推荐
我们从未走散5 小时前
从内存字典到租约内核:分布式上游账号池如何做到不超卖
分布式
.冰块.6 小时前
Ceph 分布式存储实战(一):架构入门与 cephadm 集群部署
分布式·ceph·架构·cephadm
j7~6 小时前
【Redis】《一文走完服务端高并发架构演进:从单机架构到 K8S 容器编排》
分布式·架构演进·服务端高并发分布式结构演进之路·架构基本概念·架构评价指标
Flynt6 小时前
把 bug tracker 塞进 git 仓库,同步和冲突怎么解决?我把 git-bug 拆开实测了一遍
分布式·git·开源
灯澜忆梦1 天前
【RabbitMQ #3】 | Go 客户端 + SpringAMQP
分布式·golang·rabbitmq
Q26433650231 天前
【有源码】基于Spark的电商客户细分与盈利洞察分析系统-面向精准营销的电商客户细分模型构建与盈利能力可视化研究
大数据·hadoop·分布式·数据挖掘·数据分析·spark·毕业设计
新思维软件1 天前
基于无线传输的地衡系统:三节点 LoRa 组网与 MQTT 上云的分布式称重方案
分布式·stm32·单片机·嵌入式硬件·物联网·物联网开发
俊哥大数据1 天前
Flink1.20.3 实时消费 Kafka 数据并解析入湖 Paimon1.4.2 全流程实战
分布式·flink·kafka·数据湖·paimon
宸津-代码粉碎机2 天前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
程序猿乐锅2 天前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存