Golang 分散式 ID 生成系統,高效能、高可用、易擴充套件的 id 生成服務

hwholiday發表於2020-06-10

簡介

gid 是使用 golang 開發的生成分散式 Id 系統,基於資料庫號段演算法實現

效能

  • id 從記憶體生成,如果 (step) 步長設定的足夠大,qps 可達到千萬 + ### 可用性
  • id 分配依賴 mysql ,當 mysql 不可用的,如果記憶體上還有的可以繼續分配 ### 特性
  • 全域性唯一的 int64 型 id
  • 分配 ID 只訪問記憶體
  • 可無限橫向擴充套件
  • 依賴 mysql 恢復服務迅速
    ......

安裝

  • 初始化 mysql
create database gid;
use gid;
create table segments
(
    biz_tag     varchar(128) not null,
    max_id      bigint       null,
    step        int          null,
    remark      varchar(200) null,
    create_time bigint       null,
    update_time bigint       null,
    constraint segments_pk
        primary key (biz_tag)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_bin;

INSERT INTO segments(`biz_tag`, `max_id`, `step`, `remark`, `create_time`, `update_time`)
VALUES ('test', 0, 100000, 'test', 1591706686, 1591706686);
  • 編譯執行專案
 git clone https://github.com/hwholiday/gid.git
 cd gid/cmd
 go build -o gidsrv
./gidsrv -conf ./gid.toml

壓測

BenchmarkService_GetId-4         2046296               583 ns/op 

健康檢查

獲取 ID

建立 tag

  • biz_tag tag 名稱
  • max_id 從這裡開始派發 ID
  • step 步長
  • remark 備註
  • {"biz_tag":"test6","max_id":0,"step":10,"remark":"test6 tag"}
  • curl -H "Content-Type:application/json" -X POST --data '{"biz_tag":"test6","max_id":0,"step":10,"remark":"test6 tag"}' http://127.0.0.1:8080/tag

重點 SQL

Begin
UPDATE table SET max_id=max_id+step WHERE biz_tag=xxx
SELECT tag, max_id, step FROM table WHERE biz_tag=xxx
Commit

聯絡 QQ: 3355168235

完整程式碼示例

文獻

美團點評分散式 ID 生成系統

更多原創文章乾貨分享,請關注公眾號
  • Golang 分散式 ID 生成系統,高效能、高可用、易擴充套件的 id 生成服務
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章