# UUID

优:

  1. 本地生成没有了网络之类的消耗,效率非常高

缺:

  1. 不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用。
  2. 信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。

# snowflake

这种方案把64-bit分别划分成多段(机器、时间)

优:

  1. 毫秒数在高位,自增序列在低位,整个ID都是趋势递增的
  2. 本地生成没有了网络之类的消耗,效率非常高
  3. 可以根据自身业务特性分配bit位,非常灵活。

缺:

  1. 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态

# 数据库

可以利用 MySQL 中的自增属性 auto_increment 来生成全局唯一 ID,也能保证趋势递增。 但这种方式太依赖 DB,如果数据库挂了那就非常容易出问题。

优:

  1. 非常简单,利用现有数据库系统的功能实现,成本小,有DBA专业维护。
  2. ID号单调自增,可以实现一些对ID有特殊要求的业务。

缺:

  1. 强依赖DB,当DB异常时整个系统不可用,属于致命问题。配置主从复制可以尽可能的增加可用性,但是数据一致性在特殊情况下难以保证。主从切换时的不一致可能会导致重复发号。
  2. ID发号性能瓶颈限制在单台MySQL的读写性能。

参考:
https://tech.meituan.com/MT_Leaf.html
https://github.com/crossoverJie/Java-Interview/blob/master/MD/ID-generator.md