在分布式系统中,唯一标识符(ID)的生成是一个重要的问题。传统的自增长主键在分布式系统中无法直接使用,因为每个节点都有可能生成重复的ID。因此,我们需要设计一种分布式系统中能够生成唯一ID的方案。本文将介绍几种常见的分布式ID生成方案,包括雪花算法、数据库序列、UUID等,并分析其优劣势,并结合 Java 代码和使用场景进行说明。
雪花算法是一种由 Twitter 设计的分布式唯一ID生成算法,它通过将64位的ID分解为不同的部分来保证唯一性。具体来说,雪花算法的64位ID组成如下:

优势:
劣势:
- public class SnowflakeIdGenerator {
- private static final long START_TIMESTAMP = 1628251600000L; // 2021-08-06 00:00:00
- private static final long MACHINE_ID_BITS = 10L;
- private static final long SEQUENCE_BITS = 12L;
-
- private static final long MAX_MACHINE_ID = -1L ^ (-1L << MACHINE_ID_BITS);
- private static final long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BITS);
-
- private static long machineId;
- private static long sequence = 0L;
- private static long lastTimestamp = -1L;
-
- public SnowflakeIdGenerator(long machineId) {
- if (machineId < 0 || machineId > MAX_MACHINE_ID) {
- throw new IllegalArgumentException("Machine ID must be between 0 and " + MAX_MACHINE_ID);
- }
- SnowflakeIdGenerator.machineId = machineId;
- }
-
- public synchronized long generateId() {
- long timestamp = System.currentTimeMillis();
- if (timesta