Go + MySQL 实现的 ID 生成服务 SEQSVR

MIT
Google Go 查看源码»
跨平台
2018-07-02
qichengzx

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");
的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

万亿级调用下的优雅——微信序列号生成器架构设计及演变(下)

版权声明:本文由曾钦松原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/201 来源:腾云阁 https://www.qcloud.com/community 上一篇文章介绍了seqsvr的...

2016/11/11 13:59
7
0
万亿级调用下的优雅——微信序列号生成器架构设计及演变(上)

版权声明:本文由曾钦松原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/200 来源:腾云阁 https://www.qcloud.com/community 微信在立项之初,就已确立...

2016/11/11 14:00
5
0
微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)

1、点评 对于IM系统来说,如何做到IM聊天消息离线差异拉取(差异拉取是为了节省流量)、消息多端同步、消息顺序保证等,是典型的IM技术难点。 就像即时通讯网整理的以下IM开发干货系列一样:...

2018/10/10 15:15
16
0
分布式ID

使用场景 todo: 方案 UUID 优点 本地生成, 性能高 缺点 长度太差, 乱序, 基于MAC地址生成,有安全漏洞 redis DB snowflake 通过划分不同分段,来表示不同含义 41-bit的时间可以表示(1L<...

03/18 21:09
3
0

没有更多内容

加载失败,请刷新页面

没有更多内容

返回顶部
顶部