从单机到高并发:手动实现分布式唯一ID生成方案

作者:袖梨 2026-05-27
01 引言 在分布式系统中,唯一标识符的生成是一个常见需求。无论是订单编号、用户ID还是交易流水号,都需要确保全局唯一性。本文将探讨不同场景下的解决方案,从单机环境到高并发分布式系统。 02 设计思路 唯一编码设计的核心是平衡唯一性、有序性、性能、可用性与存储效率。主要的分为三种: 中心化强一致:借助数据库/Redis原子发号,保证严格递增,并通过号段预取缓解性能瓶颈。 去中心化组合式(如雪花算法):节点用"时间戳+机器ID+序列号"本地拼装,高性能且趋势递增,但依赖时钟。 概率型(如UUID):随机生成,无协调开销,但无序且存储较大。 设计本质是在"无协调本地生成"与"有协调中心发号"间权衡,用位分配或号段预取打破性能与唯一性的僵局。 03 单机设计方案 虽然现代系统多为分布式架构,但单机方案仍是基础。理解这些原理有助于构建更复杂的分布式解决方案。 3.1 设计思想 完全在JVM进程内完成发号,不依赖外部中间件。通过时间戳位移保证宏观有序,通过PID与随机数混合区分进程,通过AtomicLong保证线程安全。 3.2 代码案例 public final class UniqueIdUtils { private static final AtomicLong SEQ = new AtomicLong(0); // 时间戳左移 20 位,腾出低位给自增与随机部分 private static final long TIME_SHIFT = 20L; // 进程指纹:PID ^ 20 位随机数 private static final long PROCESS_SEED; static { String name = ManagementFactory.getRuntimeMXBean().getName(); long pid = name.contains("@") ? Long.parseLong(name.split("@")[0]) : 0L; long rnd = ThreadLocalRandom.current().nextLong(1L

相关文章

精彩推荐