分布式ID生成之雪花算法
唯一ID可以標識數(shù)據(jù)的唯一性,在分布式系統(tǒng)中生成唯一ID的方案有很多,常見的方式大概有以下三種:
- 依賴數(shù)據(jù)庫,使用如MySQL自增列或Oracle序列等。
- UUID隨機數(shù)
- snowflake雪花算法(本文將要討論)
一、數(shù)據(jù)庫和UUID方案的不足之處
采用數(shù)據(jù)庫自增序列:
- 讀寫分離時,只有主節(jié)點可以進行寫操作,可能有單點故障的風險
- 分表分庫,數(shù)據(jù)遷移合并等比較麻煩
UUID隨機數(shù):
- 采用無意義字符串,沒有排序
- UUID使用字符串形式存儲,數(shù)據(jù)量大時查詢效率比較低
二、關于雪花算法
有這么一種說法,自然界中并不存在兩片完全一樣的雪花的。每一片雪花都擁有自己漂亮獨特的形狀、獨一無二。雪花算法也表示生成的ID如雪花般獨一無二。
1. 雪花算法概述
雪花算法生成的ID是純數(shù)字且具有時間順序的。其原始版本是scala版,后面出現(xiàn)了許多其他語言的版本如Java、C++等。
2. 組成結構
大致由:首位無效符、時間戳差值,機器(進程)編碼,序列號四部分組成。
3. 特點(自增、有序、適合分布式場景)
- 時間位:可以根據(jù)時間進行排序,有助于提高查詢速度。
- 機器id位:適用于分布式環(huán)境下對多節(jié)點的各個節(jié)點進行標識,可以具體根據(jù)節(jié)點數(shù)和部署情況設計劃分機器位10位長度,如劃分5位表示進程位等。
- 序列號位:是一系列的自增id,可以支持同一節(jié)點同一毫秒生成多個ID序號,12位的計數(shù)序列號支持每個節(jié)點每毫秒產(chǎn)生4096個ID序號
snowflake算法可以根據(jù)項目情況以及自身需要進行一定的修改。
三、雪花算法的缺點
雪花算法在單機系統(tǒng)上ID是遞增的,但是在分布式系統(tǒng)多節(jié)點的情況下,所有節(jié)點的時鐘并不能保證不完全同步,所以有可能會出現(xiàn)不是全局遞增的情況。
四、總結
分布式唯一ID的方案有很多,本文主要討論了雪花算法,組成結構大致分為了無效位、時間位、機器位和序列號位。其特點是自增、有序、純數(shù)字組成查詢效率高且不依賴于數(shù)據(jù)庫。適合在分布式的場景中應用,可根據(jù)需求調整具體實現(xiàn)細節(jié)。