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