Golang实现Snowflake算法

SnowFlake算法是Twitter设计的一个可以在分布式系统中生成唯一的ID的算法,它可以满足Twitter每秒上万条消息ID分配的请求,这些消息ID是唯一的且有大致的递增顺序。

SnowFlake的算法是产生一个int64整型的ID,这段ID一共分为4部分,通过标示部分、时间戳、worker的Id、生成ID的序号来组合成为一个自增的ID,并且是全局唯一的。

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

  • 1位标识部分
    由于最高位是符号位,正数是0,负数是1,所以一般为0
  • 41位时间戳部分
    这个是毫秒级别的的时间,但是使用的是当前时间减去系统开始时的差值,因为如果使用现在的值,会减少生成ID的唯一性,
  • 10位节点部分
    前5位作为数据中心的标示,后5位作为机器标示,可以部分1024个节点
  • 12位序号
    支持同一毫秒内同一个节点可以生成4096个ID;

Golang代码实现SnowFlake

Snowflake的优缺点

优点

  • 生成ID时不依赖于数据库,完全在内存生成,高性能高可用。
  • 容量大,每秒可生成几百万ID。
  • ID呈趋势递增,后续插入数据库的索引树的时候,性能较高。

缺点

  • 依赖与系统时钟的一致性,如果某台机器系统时钟回拨,那有可能造成ID冲突