MySQL基础学习笔记——分布式ID方案选择(3):雪花算法

雪花算法-Snowflake

SnowflakeTwitter提出来的一个算法,其目的是生成一个64bit的整数:

时间戳(核心) + 机器信息 + 序列号 == 雪花算法

MySQL基础学习笔记——分布式ID方案选择(3):雪花算法_第1张图片

  • 1bit:一般是符号位,不做处理;
  • 41bit:用来记录时间戳,这里可以记录69年,如果设置好起始时间比如今年2019年,那么用到2089年,到时候怎么办?要是这个系统能用69年,我相信这个系统早都重构了好多次了;
  • 10bit10bit用来记录机器ID,总共可以记录1024台机器,一般用前5位代表数据中心,后面5位是某个数据中心的机器ID;
  • 12bit:循环位,用来对同一个毫秒之内产生不同的ID,12位可以最多记录4095个,也就是在同一个机器同一毫秒最多记录4095个,多余的需要进行等待下1毫秒。

上面只是一个将64bit划分的标准,当然也不一定怎么做,可以根据不同业务的具体场景来划分,比如下面给出一个业务场景:

  • 服务目前QPS10万,预计几年之内会发展到百万。
  • 当前机器三地部署,上海、北京、深圳都有。
  • 当前机器10台左右,预计未来会增加至百台。

这个时候我们根据上面的场景可以再次合理的划分62bitQPS几年之内会发展到百万,那么每毫秒就是千级的请求,目前10台机器那么每台机器承担百级的请求,为了保证扩展,后面的循环位可以限制到1024也就是2^10,那么循环10位就足够了。
机器三地部署我们可以用3bit总共8来表示机房位置,当前的机器10台,为了保证扩展到百台那么可以用7bit128来表示,时间位依然是41bit,那么剩下64-10-3-7-41-1=2bit,还剩2bit可以用来进行扩展。
在这里插入图片描述

时钟回拨(缺点)

  • 因为机器的原因会发生时间回拨,我们的雪花算法是强依赖我们的时间的,如果时间发生回拨,有可能会发生重复的ID,我们上面的nextID中我们用当前时间和上一次的时间进行判断,如果当前时间小于上一次的时间那么肯定是发生了回拨,算法会直接抛出异常。

你可能感兴趣的:(学习笔记)