乙個唯一 id 在乙個分布式系統中是非常重要的乙個業務屬性,其中包括一些如訂單 id,訊息 id ,會話 id,他們都有一些共有的特性:
全域性唯一很好理解,目的就是唯一標識某個次請求,某個業務。
通常有以下幾種方案:
可以利用mysql
中的自增屬性auto_increment
來生成全域性唯一 id,也能保證趨勢遞增。 但這種方式太依賴 db,如果資料庫掛了那就非常容易出問題。
但也有改進空間,可以將資料庫水平拆分,如果拆為了兩個庫 a 庫和 b 庫。 a 庫的遞增方式可以是0 ,2 ,4 ,6
。b 庫則是1 ,3 ,5 ,7
。這樣的方式可以提高系統可用性,並且 id 也是趨勢遞增的。
還可以採用uuid
的方式生成唯一 id,由於是在本地生成沒有了網路之類的消耗,所有效率非常高。
但也有以下幾個問題:
這種做法非常簡單,可以利用本地的毫秒數加上一些業務 id 來生成唯一id,這樣可以做到趨勢遞增,並且是在本地生成效率也很高。
但有乙個致命的缺點:當併發量足夠高的時候唯一性就不能保證了。
可以基於twitter
的snowflake
演算法來實現。它主要是一種劃分命名空間的演算法,將生成的 id 按照機器、時間等來進行標誌。
分布式ID生成器
一 需求緣起 幾乎所有的業務系統,都有生成乙個唯一記錄標識的需求,例如 這個記錄標識往往就是資料庫中的主鍵,資料庫上會建立聚集索引 cluster index 即在物理儲存上以這個字段排序。這個記錄標識上的查詢,往往又有分頁或者排序的業務需求,例如 所以往往要有乙個time欄位,並且在time欄位上...
自學 分布式ID生成器
最近在做乙個專案,遇到了乙個小問題 針對資料庫的主鍵自增這塊怎麼解決,前提是採用分片部署。如果還是用我們之前的方式主鍵自增,會造成乙個表中id的重複。舉例說明 比如有乙個商品表,將這個商品表部署在3臺伺服器上 server1 server2 server3。如果是以前的主鍵自增 server1中會從...
分布式ID生成器(雪花演算法)
目前微服務架構盛行,在分布式系統中的操作中都會有一些全域性性id的需求,所以我們不能使用資料庫本身的自增功能來產生主鍵值,只能由程式來生成唯一的主鍵值。我們採用的是開源的twitter 非官方中文慣稱 推特.是國外的乙個 是乙個社交網路及微部落格服務 的snowflake 雪花 演算法。各個段解析 ...