随笔记录|唯一ID的生成策略

93 阅读2分钟

随笔记录:唯一ID的生成

许多应用场景里应该都会遇到要求生成唯一的 ID 的需求,如果是单服务器就很简单,可以使用一个增量的 ID或者使用一个获取当天时间的函数,但在分布式中该方案是不可行的,可能创建出重复的 ID。你可以使用以下三种有效策略:

  • 应用程序级通用的唯一标识 UUID, 是应用程序通过不同的方式生成的 128位数字。例如,它可以组合时间、服务器的MAC 地址或MD5 哈希。

    • UUID 的优势:服务器间不需要同步,发生相同的概率低
    • UUID 的缺点:有128位,长度过长,且不是连续的
  • 数据库级别的唯一标识 UUID。很多数据库提供自增功能,所以数据库服务可以用来生成唯一的ID。

    • 优势:使得应用程序代码变得简单;生成的 ID是连续的,且大小很短;
    • 缺点:从数据库中获取ID,使得程序增加额外的消耗;数据库成为单点故障
  • 雪花算法生成 ID,该ID的生成由多个字段组合:1bit 占位符 + 41 bit 时间戳 + 10 bit 工作机器 Id + 12 位序列号

    • 优势:
      • 全局唯一;
      • 高可用,因为每台机器每毫秒可以生成 4096个 ID,所以在分布式中可以保证不产生重复可用的ID;
      • 可扩展,因为它支持系统生成更多唯一的 ID。比如添加数据中心 ID 以及机器 ID ,将会增加每秒生成的唯一ID 总数和系统生成的ID 总数。基本生成的ID 能满足你所有的用例。
      • Id 是时间可排序,因为它所生成的 Id 的都是根据时间趋势递增