回覆列表
  • 1 # java架構設計

    分散式系統中的“身份證”即分散式Id且唯一。如何生成分散式系統中的唯一Id?考慮這個問題的時候,我覺得可以從“帶著問題去找方案”這個思路去聊聊,也就是說我要生成的這個分散式Id需要滿足哪些條件呢?

    分散式Id生成需要滿足的條件全域性唯一:這個不用多說了,不然還有什麼分散式“身份證”?高可用:不能有單點故障,小心引起雪崩;安全:這個Id不能是連續的,否則讓非友好人士發現規則,資料爬去、資料預測都會有一定的安全風險;保證順序遞增:MySQL的Innodb引擎採用B+樹演算法儲存索引資料,為了提高效能,就得要求索引的主鍵在一定程度上是有序的,這樣不管是寫入還是查詢效率都很好的;分片支援:可以根據分散式Id得到具體的業務shardingId,方便業務查詢;不要太長:64位儲存最佳?

    缺點:只有主庫才能生成,容易造成單點故障;效能不足時候,無法擴充套件;分庫分表會有很多麻煩。

    UUID

    優點:簡單直接,無效能問題,真正的全球唯一

    缺點:無規則;UUID是字串,IO傳輸資料量大,儲存空間大,查詢效率低;基於UUID分庫分表更難。

    redis生成

    優點:基於記憶體操作的reids效能比資料庫好;可以基於叢集做有序的數字Id生成;利於分庫分表;

    缺點:需要搭建一套高可用redis叢集;需要基於叢集編寫生成Id的方案;

    zookeeper生成和redis類似業務規則生成舉例訂單號的生成:10_2298765801_1565283246399_781.業務欄位用於區分具體的業務,採用2-4位,可以根據不同的系統或者業務自由決定;2.使用者Id,最長10位夠了吧3.毫秒級時間戳:13位4.隨機數:2-4位

    個人還是喜歡採用業務規則生成的方案,效能肯定沒的說,基於記憶體計算即可得到,也不存在什麼單點故障,哪臺機器都可以自己生成,不依賴第三方服務或者應用,也能保證順序遞增。

  • 中秋節和大豐收的關聯?
  • 寫給十八歲男友的一封情書?