在龐大複雜的分佈式系統中,一般須要對海量數據進行惟一標識,隨着數據日漸增加,對數據分庫分表之後須要有一個惟一 ID 來標識一條數據,而數據庫的自增 ID 顯然不能知足需求,此時就須要有一個可以生成全局惟一 ID 的系統,須要知足如下條件:git
上述的 2 和 3 點需求是互斥的,沒法使用同一個方案知足。github
以 MySQL 爲例,利用給字段設置 auto_increment_increment
和 auto_increment_offset
來實現 ID 自增。每次業務可使用下列 SQL 進行讀寫獲得 ID:算法
begin; REPLACE INTO Tickets64 (stub) VALUES ('a'); SELECT LAST_INSERT_ID(); commit;
Snowflake
(雪花算法)是由 Twitter
發佈的分佈式 ID 生成算法,它可以保證不一樣進程主鍵的不重複性,以及相同進程主鍵的有序性。它是經過時間位實現單調遞增,且各個服務器若是都作了時間同步,那麼生成的 ID 能夠認爲是整體有序的。sql
Leaf
最先期需求是各個業務線的訂單 ID 生成需求。在美團早期,有的業務直接經過數據庫自增的方式生成 ID,有的業務經過 Redis 緩存來生成 ID,也有的業務直接用 UUID 這種方式來生成 ID。以上的方式各自有各自的問題,所以決定實現一套分佈式 ID 生成服務來知足需求。docker
Leaf-segment
數據庫方案,在使用數據庫的方案上,作了如下改變:數據庫
優勢:api
缺點:緩存
該方案徹底沿用 snowflake
方案設計。對於 workerID
的分配,當服務器集羣數量較小的狀況下,徹底能夠手動配置。服務規模較大時,動手配置成本過高,因此使用 Zookeeper
持久順序節點的特性自動對 snowflake
節點配置。安全
啓動步驟以下:服務器
Leaf-snowflake
服務,鏈接 Zookeeper
,在 leaf_forever
父節點下檢查本身是否已經註冊過。workerID
,啓動服務。workerID
號。$ git clone https://github.com/antoniopeng/leaf.git
$ cd leaf
$ mvn clean install -DskipTests
$ cd leaf-docker
$ chmod +x build.sh
$ ./build.sh
$ docker-compose up -d
生成地址:http://localhost:8080/api/snowflake/get/test
$ curl http://localhost:8080/api/snowflake/get/test
文章做者:彭超
本文首發於我的博客:https://antoniopeng.com/2020/07/22/%E5%88%86%E5%B8%83%E5%BC%8F/%E5%88%86%E5%B8%83%E5%BC%8F%20ID%20%E7%94%9F%E6%88%90%E6%96%B9%E6%A1%88%E4%B9%8B%E7%BE%8E%E5%9B%A2%20Leaf/
- 版權聲明:本博客全部文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 彭超的博客 | Antonio Blog