“談談常用的分布式ID設計方案”!
一個作業了7年的同學,被問到了這樣一個問題,
問題并不難,但是在實際面試的時候,如果只是回答1,2,3
很難通過面試,因為作為一個高級程式員,還需要有自己的理解和思考,
大家好,我是Mic,一個作業了14年的Java程式員,
這個問題的高手回答,我整理到了15W字的面試檔案里面,大家可以私信我領取,
下面看看高手的回答
高手:
首先,分布式全域ID的的解決方案有很多,比如:
- 使用Mysql的全域表
- 使用Zookeeper的有序節點
- 使用MongoDB的objectid
- redis的自增id
- UUID等等
- ......
這些方案只是解決基礎的id唯一性問題,在實際生產環境中,需要構建一個全域唯一id
還需要考慮更多的因素:
-
有序性, 有序的ID能夠更好的確認資料的位置,以及B+數的存盤結構中,范圍查詢的效率更高,并且可以提升B+樹資料維護的效率,
-
安全性,避免惡意爬去資料造成資料泄露
-
可用性,ID生成系統的可用性要求非常高,一旦出現故障就會造成業務不可用的問題
-
性能,全域id生成系統需要滿足整個公司的業務需求,涉及到億級別的呼叫,對性能要求較高
因此,在如果我們選擇資料庫的全域表,你沒獲取一次id就需要更新資料庫,性能上限比較明顯,
而且基于資料庫構建高擴展和高性能的解決方案難度很大,
所以,目前市面上主流的解決方案是基于Twitter早期開源的Snowflake雪花演算法,
它是由64位長度組成的全域id生成演算法,通過對64位進行區間劃分來表述不同含義實作唯一性,

它的好處是:
- 演算法實作簡單
- 不存在太多外部依賴
- 可以生成有意義的有序編號
- 基于位運算,性能也很好,Twitter測驗的峰值是10萬個每秒,
另外,美團公司開源了一個全域唯一id生成系統leaf,它里面也用到了雪花演算法去構建全域唯一id
并且在高性能和高可用方面,做了很多的優化,為美團內部業務提供了每天上億次的呼叫,
總結
很明顯這是一個熱點問題,并且在實際應用中也比較廣泛,
建議各位粉絲在這個領域做一些更深層次的思考和研究,從而去應對面試官更進一步的追問
記住,全域ID本身的設計方案和實作細節是很重要的,
大家記得點贊收藏加關注
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502448.html
標籤:其他
上一篇:Java基礎學習筆記(2)
