分布式_分布式ID生成方案(阿里面试题,实时思考出来的)

一、前言

    刚好前段时间面试阿里被问到了这个问题,这里就聊聊吧~~

二、雪花(SnowFlake)算法

    记得当时被面试官问到这个问题的时候,还不知道有雪花算法这个东西。就说了下自己的想法。

  1. 首先想到了肯定要有一个时间戳,为了确保精度,决定使用纳秒。
  2. 然后想到肯定是多台服务器一起产生id,为了区分机器,想到了用机器编码区分。接着在一想,如果和阿里一样有多个机房,每个机房的机器编码可能重复,那就在加一个机房号吧。
  3. 有了时间戳、机器号和机房号,最后加一个单位时间的只增数吧,每隔一段时间重置一次,一段时间可能是1秒或者几百毫秒,可以多次实验确定。

    说完自己的想法以后,面试官说这个和雪花算法很类似,然后问了我那这个id的长度你准备设计多长?笔者就说先试纳秒时间戳的长度,然后机房号给个2字节差不多了,毕竟16进制的FF可以存255个机房了。机器号给个什么4个字节,一个机房65535台机器够多了吧。然后单位时间的自增ID也给个6字节,应该不会有单台服务器每秒能承受16777215个请求吧。。。
    面试官听完以后说这个方法可以。但是你有没有想过,在分布式部署的情况,可能会有一台时间基准服务器,某台的服务器的时间可能超了那么一点点,那么在下一次进行时间校准的时候,可能会回到原先的时间从而导致产生重复id,有什么好的办法解决吗?
    当时笔者确实没想到,但是面试官给了一下提示,可以用缓存的方式想想。然后我就说了用Map存储一段时间点的最大id,因为就算尝试时间误差,范围也不会太大。然后面试官说这样也行,但不是最好的。这里面试官也没告诉我最好的是什么,我也没问。。。有知道的大佬可以评论区告诉笔者么?接着面试官就说这种算法产生的第一个id会非常大,有没有什么办法让第一个id可以从1开始?

三、借助第三方工具,比如redis

    有没有什么办法让第一个id可以从1开始?当时我就想到了自增id,还要保证原子性,还要是分布式的原子性。于是笔者就想到了使用redis的自增方法产生id。由于redis本身是单线程安全的,所以用这个方法简单粗暴,redis本身的高可用也有很多方案实现(这里不细讲)。然后面试官说这确实很简单粗暴也可行。接着又问,如果不适用第三方工具,就在应用程序里面做该如何实现?

四、自己取名叫分区思想

     话不多说,上图解释,虽然图貌似没什么用。

好像吧解释也写在图里面了,那就这样吧。不知道各位大神们还有什么其他见解没?欢迎评论区讨论~

猜你喜欢

转载自blog.csdn.net/qq_30752451/article/details/106522739