SEQSVR:Go + MySQL 實現的高效能 ID 生成服務

qichengzx發表於2018-07-02

SEQSVR

Go + MySQL 實現的 ID 生成服務

特性

  • 分散式:可任意橫向擴充套件
  • 高效能:分配 ID 只訪問記憶體 (到達上限會請求資料庫一次)
  • 易用性:對外提供 HTTP 服務
  • 唯一性:MySQL 自增 ID,永不重複
  • 高可靠:MySQL 持久化

依賴項

本專案使用下列優秀的專案作為必要元件。

  • gopkg.in/yaml.v2
  • github.com/go-sql-driver/mysql
  • github.com/satori/go.uuid

安裝

注意:需要在啟動之前建立資料庫並修改配置檔案中資料庫的配置。

go get 方式:

需保證 $GOPATH/bin 在系統 PATH 中。

go get github.com/qichengzx/seqsvr
seqsvr

單獨編譯:

git clone git@github.com:qichengzx/seqsvr.git
cd seqsvr
go build .
./seqsvr

Docker 方式:

Dockerfile 使用了 Docker 多階段構建功能,需保證 Docker 版本在 17.05 及以上。詳見:Use multi-stage builds

git clone git@github.com:qichengzx/seqsvr.git
cd seqsvr
docker build seqsvr:latest .
docker run -p 8000:8000 seqsvr:latest

初始化資料庫

資料庫名稱可以自定義,修改 config.yml 即可。

然後匯入以下 SQL 生成資料表。

CREATE TABLE `generator_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` char(36) NOT NULL COMMENT '機器識別碼',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  UNIQUE KEY `stub_UNIQUE` (`uuid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

修改配置

配置檔案使用 YAML 格式。

#app
port: ':8000'

#service
step: 100

#db
mysql:
  user: 'root'
  password: ''
  host: 'tcp(localhost:3306)'
  database: 'sequence'

可修改埠號及 MySQL 的配置。

使用

curl http://localhost:8000/new

{"code":0,"msg":"ok","data":{"id":101}}

原理

本專案設計原理來自 攜程技術中心 的乾貨 | 分散式架構系統生成全域性唯一序列號的一個思路

服務初始化後第一次請求會在 MySQL 資料庫中插入一條資料,以生成初始 ID。

後續的請求,都會在記憶體中進行自增返回,並且保證返回的 ID 不會超過設定的上限,到達上限後會再次從 MySQL 中更新資料,返回新的初始 ID 。

核心 SQL
REPLACE INTO `generator_table` (uuid) VALUES ("54f5a3e2-e04c-4664-81db-d7f6a1259d01");

歡迎 star。

更多原創文章乾貨分享,請關注公眾號
  • SEQSVR:Go + MySQL 實現的高效能 ID 生成服務
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章