提高基于DB的ID生成性能方案-IDSnowman

ID Snow Man

背景:

分布式需求下的ID生成方案有很多种。但满足以下条件的不多:
1、除现有的DB外,不增加运维负担和不增加基础设施的资源要求
2、ID大体趋势递增(实际情况中一般不需要严格递增,即使是用AUTO_INCREMENT字段,也因事务提交顺序和rollback问题不会严格递增)
3、ID种子状态需要持久化

词汇:

OSP:唯品会服务化基础平台
Saturn:唯品会分布式JOB平台
VMS:唯品会MQ平台

基于AUTO_INCREMENT字段的方案

基于现有应用环境,用DB实现以上需求可能是比较简单的方案。
基于mysql的持久化和协调,可以有两个方案:
1、建立带AUTO_INCREMENT字段的表,用AUTO_INCREMENT机制生成ID。
有两个子方案:
1a:获取ID时,insert into 然后 last_insert_id
1b:加入唯一索引字段,获取ID时,replace into(唯一字段名) values ('重复的唯一字段值') 然后 last_insert_id。

方案1b的好处是保证数据库中只有和行记录,不需要定期归档数据。
基于AUTO_INCREMENT字段问题是:在高并发情况下生成ID相关的并发数、TPS数要求与数据一致。在业务已经分库,但ID生成没分库的情况下,势必成为瓶颈。
解决方法是:
1、把AUTO_INCREMENT字段的表也分库,按一定策略路由ID生成请求到不同的库。库与库进行ID号的隔离,方法可以是:
a. AUTO_INCREMENT中不同的大初始号段
b. AUTO_INCREMENT相同步长(如32),不同的初始值
以上分库方法的问题是可能使ID大体趋势不是递增。

批量号段派发方案-IDSnowman

如果应用和DB的一次交互可以拿到一批连续ID,而且拿到ID有使用有效期。这样既可以减少DB TPS、并发、连接数,也可以提高ID的生成的平均时效。

DB表结构

CREATE TABLE `sequence_table` (
    `biz_type` VARCHAR(50) NOT NULL COMMENT '业务类型',
    `cur_id` BIGINT(20) NOT NULL COMMENT '当前值',
    `step` INT(11) NOT NULL COMMENT '步长',
    `time_to_live` INT(11) NOT NULL COMMENT '生存时长(秒)',
    PRIMARY KEY (`biz_type`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

架构设计

架构图

说明:
每个应用的业务线程池中,维护一个线程本地变量,IDBuffer,其结构大体如下:

线程本地ID Buffer : [
占用相关: {batch_max_id=800, cur_id=601, birthday="20170115 03:02:01"}
调整相关:{……}]

每个业务类型记录其当前批次的最大值,当前值,批次发放时间。

具体的实时顺序图:

具体的实时顺序图

说明:
ID生成库使用与业务分享独立的DB连接池,DB连接的事务为autocommit=1。即不使用事务。
注意到其中的LAST_INSERT_ID(cur_id + Step) 。函数为设计DB连接的会话本地last_insert_id变量,不影响其它会话(见:http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-insert-id)。

这样,DB的TPS、并发、连接数可以因批次步长和批次有效时间的大小而数倍下降。ID也大体趋势递增。
封装方法
可以封装为OSP服务(好处是减少DB连接数)。或一个公共JAR(好处是减少运行服务依赖),由应用控制DB连接池。

单点问题 single point of failure (SPOF)

由DB决定。为DBA保障。

封装讨论

实现上,是否真有需要跨表的唯一顺序ID生成需求。这是值得考虑的。如果没有这个需求,事情可以简单很多。

[参考文章]

http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/
http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_last-insert-id
https://my.oschina.net/CandyDesire/blog/619122
http://tech.meituan.com/mtddl.html

ID Snow Man
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,567评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,785评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 你是我 流徙的方向 一盏灯 一座城 两人的流浪 当白昼停下奏乐 还在苦想 眼中的你 是否没遗忘 当初我们写下的 不...
    杰sir_阅读 224评论 0 0
  • 014月20日,古历四月初五,五一小长假第二天。老爸过生,七十七岁。 早晨八点,准时出发,去乡下。 去“麦上花开”...
    白马少年说阅读 441评论 5 4