分布式ID-雪花算法
上面的三種方法總的來說是基于自增思想的,而接下來就介紹比較著名的雪花算法-snowflake。
我們可以換個角度來對分布式ID進行思考,只要能讓負責生成分布式ID的每臺機器在每毫秒內生成不一樣的ID就行了。
snowflake是twitter開源的分布式ID生成算法,是一種算法,所以它和上面的三種生成分布式ID機制不太一樣,它不依賴數據庫。
核心思想是:分布式ID固定是一個long型的數字,一個long型占8個字節,也就是64個bit,原始snowflake算法中對于bit的分配如下圖:
第一個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 - beyondfengyu/SnowFlake: Twitter的雪花算法SnowFlake,使用Java語言實現。
在大廠里,其實并沒有直接使用snowflake,而是進行了改造,因為snowflake算法中最難實踐的就是工作機器id,原始的snowflake算法需要人工去為每臺機器去指定一個機器id,并配置在某個地方從而讓snowflake從此處獲取機器id。
總結
以上是生活随笔為你收集整理的分布式ID-雪花算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式ID-号段模式
- 下一篇: 分布式ID-百度(uid-generat