最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
从单机到高并发:手动实现分布式唯一ID生成方案
时间:2026-05-27 11:00:02 编辑:袖梨 来源:一聚教程网
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