分布式唯一id實現
在業務開發中,大量場景需要用到唯一id,比如系統流水號,訂單號等等。
那麼,分布式唯一id有哪些特徵呢?
唯一性: 生成的id全域性唯一。
高可用: 可保證在高併發下的可用性,確保任何時候都能正確生成id。
自主性:分布式環境下不依賴中心認證,即可自行生成id。
安全性:不暴露系統和業務資訊。
有序性:生成的id按某種規則有序,便於資料庫插入及排序。(某些情況下也需要無序id)
常見的分布式唯一id生成方法有哪些?
資料庫自增id
使用資料庫的id自增策略。
優點:簡單,天然有序。
缺點:
:併發性不好。
:依賴資料庫,資料庫故障後不可用。
redis生成id
redis的所有命令操作都是單執行緒的,本身提供像incr和increby這樣的自增原子命令,能保證生成的id唯一有序。
優點:
:併發效能好
:數字id天然有序,對分頁或排序結果很有幫忙
缺點::如果系統中沒有redis,需要引入新元件,增加系統複雜度。
uuid生成
結合機器的網絡卡(基於名字空間/名字的雜湊值md5/sha1),當地時間(基於時間戳&時鐘序列)及乙個隨機數來生成uuid
優點:本地生成,沒有網路消耗,生成簡單,沒有高可用風險。
缺點:
:不易於儲存:uuid太長,16位元組128位。
:uuid無序,不利於資料庫查詢,查詢效率低。
zookeeper實現分布式唯一id
在過去的單庫單表型系統中,通常第可以使用資料庫字段自帶的auto increment屬性來自動為每條記錄生成個唯一的id。但是分庫分表後,就無法在依靠資料庫的auto increment屬性來唯一標識一條記錄了。此時我們就可以用zookeeper在分布式環境下生成全域性唯一id。設計思路 publi...
分布式唯一ID方案
背景 在複雜的分布式系統中,往往需要對大量的資料和訊息進行唯一標識。如對大量的訂單做分庫分表後,需要有乙個唯一的id來標識一條資料或訊息,資料庫的自增id顯然不能滿足需求。業務系統對分布式唯一id的要求 全域性唯一性,不能重複 趨勢遞增,在mysql innodb引擎中使用的是聚集索引,由於多數rd...
分布式系統全域性唯一ID
全域性的唯一流水id 可以將乙個請求在分布式系統中的流轉路徑聚合。生成唯一id有兩種方法 持久型 使用資料庫表自增欄位或者sequence 生成,為了提高效率,每個應用節點可以快取乙個批次的id 如果機器重啟則可能會損失一部分id 但是這並不會產生任何問題。時間型 一般由機器號 業務號 時間 單節點...