“談談常用的分散式ID設計方案”! 一個工作了7年的同學,被問到了這樣一個問題。 問題並不難,但是在實際面試的時候,如果只是回答1,2,3 很難通過面試,因為作為一個高級程式員,還需要有自己的理解和思考。 大家好,我是Mic,一個工作了14年的Java程式員。 這個問題的高手回答,我整理到了15W字 ...
“談談常用的分散式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學架構」公眾號公眾號獲取更多技術乾貨!