原创分享 Golang 分布式 ID 生成系统,高性能、高可用、易扩展的 id 生成服务

hwholiday · 2020年06月10日 · 1739 次阅读
本帖已被设为精华帖!

简介

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 生成系统

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
astaxie 将本帖设为了精华贴 06月10日 20:25
moss GoCN 每日新闻 (2020-06-13) 中提及了此贴 06月13日 18:19
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册