SEQSVR:Go + MySQL 實現的高效能 ID 生成服務
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。
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- Golang 分散式 ID 生成系統,高效能、高可用、易擴充套件的 id 生成服務Golang分散式套件
- Leaf:美團分散式ID生成服務開源分散式
- 分散式ID生成服務,真的有必要搞一個分散式
- Guuid: 由 Go 語言開發的 UUID 生成服務UIGo
- Go實現對MySQL的增刪改查GoMySql
- 自增ID的實現
- GitHub - wanghongfei/gogate:Go實現的高效能Spring Cloud閘道器GithubGoSpringCloud
- 高效能 Go 日誌庫 zap 設計與實現Go
- MySQL事務實現原理MySql
- 一個高效能的go 紅黑樹 map, 模擬STL實現Go
- MySQL是如何實現事務的ACIDMySql
- Go實現基於WebSocket的彈幕服務GoWeb
- MySQL Binlog 增量同步工具 go-mysql-transfer 實現詳解MySqlGo
- Go微服務框架go-kratos實戰04:kratos中服務註冊和服務發現的使用Go微服務框架
- MySQL實現事務的提交和回滾MySql
- 三.Go微服務--令牌桶實現原理Go微服務
- Go Web 服務框架實現詳解GoWeb框架
- Go使用grpc+http打造高效能微服務GoRPCHTTP微服務
- go-kit 微服務 服務監控 (prometheus 實現)Go微服務Prometheus
- 高效能MySQL實戰(二):索引MySql索引
- GO實現Redis:GO實現Redis的AOF持久化(4)GoRedis持久化
- go RWMutex 的實現GoMutex
- [高效能MYSQL學習筆記]事務MySql筆記
- 面試題:MySQL事務的ACID如何實現?面試題MySql
- 【Mysql核心技術】聊聊事務的實現原理MySql
- 實現Java集合迭代的高效能Java
- 詳解螞蟻金服 SOFAJRaft | 生產級高效能 Java 實現RaftJava
- 詳解螞蟻金服 SOFAJRaft:生產級高效能 Java 實現RaftJava
- 10行C++程式碼實現高效能HTTP服務C++HTTP
- redis實現分散式id方案Redis分散式
- MySQL叢集架構:MHA+MySQL-PROXY+LVS實現MySQL叢集架構高可用/高效能MySql架構
- MySQL資料庫6:Go與MySQL事務MySql資料庫Go
- 搞懂MySQL InnoDB事務ACID實現原理MySql
- go-zero微服務實戰系列(十、分散式事務如何實現)Go微服務分散式
- MySQL 索引的型別——《高效能MySQL》MySql索引型別
- 深入學習MySQL事務:ACID特性的實現原理MySql
- MySQL 中基於 XA 實現的分散式事務MySql分散式
- MySQL資料庫事務隔離性的實現MySql資料庫