適用于分布式唯一標識碼的生成算法有哪些?
謝邀~
關(guān)于這個問題,有幾個方案和大家分享一下。
利用數(shù)據(jù)庫生成先說最笨的方法,利用數(shù)據(jù)庫的自增長序列生成,數(shù)據(jù)庫內(nèi)唯一。
優(yōu)點:理解起來最容易,用起來也最容易。
缺點:也非常明顯了,每種數(shù)據(jù)庫的實現(xiàn)不同,如果數(shù)據(jù)庫需要遷移的話比較麻煩;最大的問題是性能問題,不太好擴展,如果并發(fā)大的時候,數(shù)據(jù)庫很可能扛不住。
利用Redis/MongoDB/zookeeper生成Redis的單線程的,利用incr和increby;MongoDB的ObjectId;ZK通過znode數(shù)據(jù)版本;都可以生成全局的唯一標識碼。
優(yōu)點:性能高于數(shù)據(jù)庫;可以使用集群部署。
缺點:需要引入對應(yīng)的組件,增加系統(tǒng)的復(fù)雜度。
UUID這個是分布式架構(gòu)中,生成唯一標識碼最常用的算法。
UUID有基于MAC地址的,加上時間和時鐘序列的,也有基于偽隨機數(shù)的,基于加密哈希的。
優(yōu)點:本地生成,不需要第三方組件,生成比較簡單,性能好。
缺點:長度長,不利于存儲,并且沒有排序,是個字符串,不利于查詢。解決無序問題,可參考Comb算法(combined guid/timestamp)。
SnowflakeTwitter開源,基于zk,41位時間戳(毫秒數(shù))+10位機器的ID+12位毫秒內(nèi)的流水號+1位符號位(永遠是0)。
優(yōu)點:性能不錯,單機內(nèi)遞增。
缺點:依賴zk;依賴于機器時鐘,分布式環(huán)境內(nèi)可能會不是全局遞增。
UidGenerator百度開源,基于snowflake算法。
Leaf美團開源。
優(yōu)點:能保證全局唯一性、高可用、趨勢遞增(不太安全,比如泄露公司訂單數(shù)量)、單調(diào)遞增等。
缺點:依然會依賴第三方組件,zk或數(shù)據(jù)庫。
我將持續(xù)分享Java開發(fā)、架構(gòu)設(shè)計、程序員職業(yè)發(fā)展等方面的見解,希望能得到你的關(guān)注。