mysql序列号生成软件_GitHub - spcent/seq: 基于mysql的序列号生成器
seq
分布式架構下,唯一序列號生成是我們在設計一個系統,尤其是數據庫使用分庫分表的時候常常會遇見的問題。當分成若干個sharding表后,如何能夠快速拿到一個唯一序列號,是經常遇到的問題。
基于mysql的全局唯一序列號生成器,用go實現,同時支持worker和db模式。對于訂單號,可以選擇worker模式,對于用戶id這種,可以采用db模式。
特性
分布式:可任意橫向擴展
高性能:分配ID只能訪問內存
易用性:對外提供HTTP服務
唯一性:MySQL自增ID,永不重復
高可靠:MySQL持久化
依賴項
本項目使用下列優秀的項目作為必要組件。
gopkg.in/yaml.v2
github.com/go-sql-driver/mysql
github.com/satori/go.uuid
安裝
注意:需要在啟動之前創建數據庫并修改配置文件中數據庫的配置。
單獨編譯:
git clone https://github.com/spcent/seq.git
cd seq
go build .
./seq
Docker 方式:
Dockerfile 使用了 Docker 多階段構建功能,需保證 Docker 版本在 17.05 及以上。詳見:Use multi-stage builds
git clone https://github.com/spcent/seq.git
cd seq
docker build -t seq:latest .
docker run -p 8000:8000 seq:latest
初始化數據庫
數據庫名稱可以自定義,修改config.yml即可。
然后導入下面的SQL生成數據表。
create database seq;
CREATE TABLE `seq_number` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`uuid` char(36) NOT NULL COMMENT '機器識別碼',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_uuid` (`uuid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
使用
curl http://localhost:8000/nextId
{"code":0,"msg":"ok","data":{"id":101}}
curl http://localhost:8000/nextIdSimple
102
curl http://localhost:8000/worker/1
{"code":0,"msg":"ok","data":{"id":390637407633936384}}
原理
服務初始化后第一次請求會在 MySQL 數據庫中插入一條數據,以生成初始 ID。
后續的請求,都會在內存中進行自增返回,并且保證返回的 ID 不會超過設置的上限,到達上限后會再次從 MySQL 中更新數據,返回新的初始 ID 。
參考
Tinyid(https://github.com/didi/tinyid): 是用Java開發的一款分布式id生成系統,基于數據庫號段算法實現,關于這個算法可以參考美團leaf或者tinyid原理介紹。Tinyid擴展了leaf-segment算法,支持了多db(master),同時提供了java-client(sdk)使id生成本地化,獲得了更好的性能與可用性。Tinyid在滴滴客服部門使用,均通過tinyid-client方式接入,每天生成億級別的id。
百度uid-generator(https://github.com/baidu/uid-generator): 這是基于snowflake方案實現的開源組件,借用未來時間、緩存等手段,qps可達600w+
美團leaf(https://tech.meituan.com/MT_Leaf.html): 該篇文章詳細的介紹了db號段和snowflake方案,近期也進行了Leaf開源
核心SQL
REPLACE INTO `seq_number` (uuid) VALUES ("54f5a3e2-e04c-4664-81db-d7f6a1259d01");
TODO
高可用(在ab測試中,發現存在請求被hang住的情況,響應時間不是太穩定)
批量獲取
提高rpc接口
總結
以上是生活随笔為你收集整理的mysql序列号生成软件_GitHub - spcent/seq: 基于mysql的序列号生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python真好玩 pdf 下载_Pyt
- 下一篇: 【毕设选题】基于C51单片机的毕业设计题