SystemDesign | 分布式唯一ID方案

  • UUID:
    • 版本1: Mac地址+时间戳
    • 版本4: 基于随机数, 可能是伪随机, 例如 java.util.UUID.randomUUID()是版本4的一个实现
  • Snowflake(Twitter方案):
    • 实现: 64位 = 1位符号 + 41位毫秒时间戳 + 10位机器id + 12序列号
      • 缺陷: 非严格递增, 机器上有多个线程, 如何保证1ms内每个线程生成的序列号不重复? // 可以使用随机数, 时间戳做seed, 多线程使用同一个seed(有没有并发互斥问题?)
    • 实现2: 64位 = 1位符号 + 41位毫秒时间戳 + 10位机器id + 10位进程id + 2位序号
      • 缺陷: 每个线程每毫秒只能生成4个id的限制
  • mysql自增(Flickr方案):
    • 实现: 8台Mysql, 第一台起始seq=1, 第二台起始seq=2, 每次seq+=8
    • 缺陷: 不是严格递增

@ref: