淺談全局唯一ID的生成方案
阿新 • • 發佈:2018-04-28
uid twitter 可用性 數據庫 通過 心算 開源 遞增 系統
業務系統Id必須具有唯一性的要求,在此之上還需要高可用,趨勢增長的特點;常見有下面四種方法生成Id
1.UUID
本地直接生成Id,不需要遠程調用,延時低,擴展性好,基本上沒有性能上限;但是沒有辦法保證趨勢遞增,uuid一般比較長,用字符串標識,作為主鍵索引查詢效率低
2.數據庫遞增
使用數據庫已有的功能,使用簡單,能夠保證唯一性和遞增型;但是可用性難以保證,數據庫一般是一主多從的結構,如果主庫掛了,就玩不了了,數據庫的性能決定了Id生成的性能,可以通過增加主庫,避免單點寫入,每個數據庫設置不同的初始值以及相同的增長步值,保證了可用性,但是失去了絕對增長的可用性,但這個問題不大,但是每次生成Id,還是要訪問數據庫,數據庫的瓶頸還是存在
3.Id生成服務+sequence
主鍵規則為當前毫秒數(long)+sequence;通過新建一個數據庫表,字段包含表名,初始值,最大值;每個數據庫表都需要在這個表配置一條記錄,在Id生成的服務當中回一次性拿去接下的一批sequence,緩存在數據庫當中,這樣每次生成Id的時候不要都訪問數據庫了,Id生成服務可以采用集群,當主服務掛了,其他服務可以頂上,這個切換的過程也是透明能自動完成,不過生成出來的id可能不是連續的,不過問題不大
4.類snowflake算法
snowflake算法是twitter開源的分布式Id生成算法,核心算法是一個long類型的Id,其中前41位是當前毫秒數,中間10位是機器編碼,最後12位作為sequence,理論上一秒能生成400萬的Id,性能完全夠;將毫秒數放在高位上,保證每臺服務器生成的Id是有序的,但是不能保證同一毫秒內不同的服務器生成的Id是有序的
淺談全局唯一ID的生成方案