數據庫 ID 生成方案:雪花算法

上面的三種方法總的來說是基於自增思想的,而接下來就介紹比較著名的雪花算法-snowflake。

我們可以換個角度來對分佈式ID進行思考,只要能讓負責生成分佈式ID的每臺機器在每毫秒內生成不一樣的ID就行了。

snowflake是twitter開源的分佈式ID生成算法,是一種算法,所以它和上面的三種生成分佈式ID機制不太一樣,它不依賴數據庫。

核心思想是:分佈式ID固定是一個long型的數字,一個long型佔8個字節,也就是64個bit,原始snowflake算法中對於bit的分配如下圖:

9709135-df727c3988e0ef68.png
雪花算法
  • 第一個bit位是標識部分,在java中由於long的最高位是符號位,正數是0,負數是1,一般生成的ID爲正數,所以固定爲0。
  • 時間戳部分佔41bit,這個是毫秒級的時間,一般實現上不會存儲當前的時間戳,而是時間戳的差值(當前時間-固定的開始時間),這樣可以使產生的ID從更小值開始;41位的時間戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年
  • 工作機器id佔10bit,這裏比較靈活,比如,可以使用前5位作爲數據中心機房標識,後5位作爲單機房機器標識,可以部署1024個節點。
  • 序列號部分佔12bit,支持同一毫秒內同一個節點可以生成4096個ID

根據這個算法的邏輯,只需要將這個算法用Java語言實現出來,封裝爲一個工具方法,那麼各個業務應用可以直接使用該工具方法來獲取分佈式ID,只需保證每個業務應用有自己的工作機器id即可,而不需要單獨去搭建一個獲取分佈式ID的應用。

snowflake算法實現起來並不難,提供一個github上用java實現的:github.com/beyondfengy…

在大廠裏,其實並沒有直接使用snowflake,而是進行了改造,因爲snowflake算法中最難實踐的就是工作機器id,原始的snowflake算法需要人工去爲每臺機器去指定一個機器id,並配置在某個地方從而讓snowflake從此處獲取機器id。

但是在大廠裏,機器是很多的,人力成本太大且容易出錯,所以大廠對snowflake進行了改造。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章