分布式id生成算法

UUID

优点:
  1.性能非常高:本地生成,没有网络消耗
缺点:
  1.不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用。
  2.信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。
  3.对mysql 索引不利,频繁的变动索引位置

snowflake

这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等
优点:
  1.毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。
  2.不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。
  3.可以根据自身业务特性分配bit位,非常灵活。
缺点:
  1.强依赖时钟,可能出现时钟回拨,造成id重复

时钟回拨解决

 //发生了回拨,此刻时间小于上次发号时间
 if (timestamp < lastTimestamp) {
 
            long offset = lastTimestamp - timestamp;
            if (offset <= 5) {
                try {
                    //时间偏差大小小于5ms,则等待两倍时间
                    wait(offset << 1);//wait
                    timestamp = timeGen();
                    if (timestamp < lastTimestamp) {
                       //还是小于,抛异常并上报
                        throwClockBackwardsEx(timestamp);
                      }    
                } catch (InterruptedException e) {  
                   throw  e;
                }
            } else {
                //throw
                throwClockBackwardsEx(timestamp);
            }
        }

数据库生成

以mysql举例,利用mysql的auto_increment_increment,保证id的自增
优点:
  1.简单,成本小
缺点:
  1.分库分表不适用

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容