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

hwholiday · 2020-06-10 15:26:07 · 3945 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-06-10 15:26:07 的主题,其中的信息可能已经有所发展或是发生改变。

简介

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


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3945 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传