一、前言
在一些简单系统中,我们可以直接使用数据库ID自增方式来标识和保存数据,但是随着系统的逐渐复杂,数据量的日益增多,我们可能需要对数据表、数据库实现分库分表。单纯的使用数据库的ID自增无法满足业务场景了,所以我们必须找到一种方式来生成一个全局唯一的ID。我们可以先想一下,这个生成的ID的系统需要满足什么条件呢?
1.必须是全局唯一的:如果在一个订单系统中,订单号是重复的那将是灾难的。
2.高性能:生成ID,可以说是一个业务逻辑实现非常小的环节,如果在这个环节浪费很多时间,那么势必会对业务逻辑造成影响,也是不可取的。
3.高可用:让系统99.9%是可用的
4.简单:简单是我们设计一个功能应该是一直追求的。

二、实现原理
数据库号段:顾名思义就是一个数据的一个范围,例如(100,200],这个100到200就可以称为一个号段。我们可以一次向数据库申请一个号段,然后加载到内存中,然后用自增的方式生成这个ID,如果这个号段用完了,再向数据库申请另一个新的号段。
1、数据表的设计:

id biz_type max_id tep version
1 0001 100 2000 0

biz_type::业务标识,不同业务使用不同的号段
max_id:当前最大的可用ID
tep:每次生成ID的范围长度
version:版本号,乐观锁,每次更新加上版本号,保证并发更新的准确性

2、使用步骤:

  1. 查询当前的max_id信息:select id, biz_type, max_id, step, version from tiny_id_info where biz_type=‘0001’;
  2. 计算新的max_id: new_max_id = max_id + step
  3. 更新DB中的max_id:update tiny_id_info set max_id=#{new_max_id} , verison=version+1 where id=#{id} and max_id=#{max_id} and version=#{version}
  4. 如果更新成功,则可用号段获取成功,新的可用号段为(max_id, new_max_id]
  5. 如果更新失败,则号段可能被其他线程获取,回到步骤a,进行重试。

三、高可用架构

ID生成系统对外提供http服务,请求经过负载均衡选择一个server,从事先加载好的号段中生成一个ID,如果没有号段或者号段已经用完,再向DB按照上边的步骤获取一个新的号段,多个server通过version乐观锁保证生成的号段不会重复。

四、问题与优化

  1. 假如某一个server重启或者宕机
    那么这个server生成的号段就作废了,而且只是浪费一部分号段,对这个ID生成系统没影响。
  2. DB挂了怎么办
    DB挂了,我们依然可以通过缓存加载的号段对外提供服务,不过这个时间是有限的,如果缓存的号段都用完了,那么就无法对外提供服务了。我们想要彻底解决这个问题,DB就不能是单机的。
  3. DB不是单机的,怎么保证不会生成重复ID呢?
    其实这个解决方案还是挺简单的,我们只需要在上边设计的数据表里新增字段。假如有A、B两个DB,那么我们就设定一个标识字段,让A生成偶数号段,B生成奇数号段即可。

分布式ID解决方案(一)数据库号段方式相关推荐

  1. 【面朝大厂】面试官:说几种常用的分布式 ID 解决方案

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 ...

  2. mybatis plus 插入生成id_springcloud微服务快速教程之分布式ID解决方案(mybatisplus篇)...

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 作者 |  大叔杨 来源 |  urlify.cn/BfIn2m 前言 分布式系统中,分布式ID是个必须解决的问题点: ...

  3. 最常用的分布式 ID 解决方案,都在这里了!

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 作者:小帅学编程 cnblo ...

  4. 分布式 ID 解决方案帮你总结好啦!收藏拿去面试去。

    「一.分布式 ID 概念」 说起 ID,特性就是唯一,在人的世界里,ID 就是身份证,是每个人的唯一的身份标识.在复杂的分布式系统中,往往也需要对大量的数据和消息进行唯一标识.举个例子,数据库的 ID ...

  5. 美团 Leaf分布式ID解决方案

    前言 看了一下美团的分布式ID的解决方案,谈谈自己的理解和思考.其中参考博客就是美团的分布式ID leaf的链接,可以直接跳转去看. Leaf-segment 数据库方案 这里采用的是从数据库读取,每 ...

  6. ID生成方案之号段模式

    号段模式ID生成器组件地址 https://github.com/15928587230/os-component-idworker 开箱即用, github上面有简洁的使用说明. 一 Leaf号段模 ...

  7. sis最新ip地址2020_2020年12月版 最新IP数据库 号段归属地 省市区镇村行政区划

    IP地址数据库-最新 最新IP地址数据库(qqzeng-ip) 2020年12月版 743518 条数据 基于:国内基于省市区以及运营商 国外基于国家 主要大城市以及主要运营商 版本: 全球旗舰版   ...

  8. 深度解析leaf分布式id生成服务源码(号段模式)

    原创不易,转载请注明出处 文章目录 前言 1.实现原理推演 1.1 基于mysql最简单分布式ID实现 1.2 flickr分布式id解决方案 1.3 号段+mysql 2.源码剖析 2.1初始化 2 ...

  9. 基于号段模式、百度UID实现的分布式ID生成器kylin-id

    1.简介 1.1.开源项目 kylin-id:麒麟分布式id生成器,支持号段模式.雪花算法 并未发布jar到中央仓库,需要自己本地构建 1.2.介绍 参考滴滴[tinyid] 整合百度[UID] 麒麟 ...

最新文章

  1. 以太坊RLP编码规则
  2. 货物与产品的区别_详解海外仓与保税仓的区别特点!
  3. SDUT-3362 数据结构实验之图论六:村村通公路
  4. SAP中关于物料主数据里物料类型的修改
  5. adf检验代码 python_第22期:向量自回归(VAR)模型预测——Python实现
  6. oracle索引机制
  7. 如何将不同类型数据导入Elaticsearch中?
  8. HDFS源码解析:教你用HDFS客户端写数据
  9. java php 采集数据,php和java进行交互数据
  10. linux中Chmod + X
  11. 使用GDAL库读取SRTM格式的高程数据
  12. SPSS学习 日记
  13. mac 更新系统后 idea 意外退出
  14. caniuse-lite is outdated. Please run next command `npm update caniuse-lite browserslist`
  15. linux关键vi按什么键n,linux vi 使用方法
  16. vscode启动Python调试 找不到指定模块
  17. 移动云API开放平台助力开发者驰骋云端
  18. 岁月温柔-17 妈妈在市第一人民医院ICU第七天
  19. 转:著名的100个管理定律点评2 -- 以人为本的人性化管理
  20. excel两个表格数据对比_vue实现json数据导出Excel表格

热门文章

  1. Qt5+安装包制作(Qt Installer Framework)
  2. xp系统无线配置服务器,TP-Link无线路由器上网设置(XP 系统)
  3. 从零开始使用ZBrush制作同人版Ellie游戏角色模型,这个教程不要错过!
  4. MTK启动无线热点的过程
  5. C# 使用tableLayoutPanel控件实现窗体布局
  6. 通俗易懂:Attention中的Q、K、V是什么?怎么得到Q、K、V?
  7. Python创建多维列表(多维数组)
  8. Three Religions CodeForces - 1149B (字符串,dp)
  9. 软件设计—项目管理日记(5)
  10. 【Android】动态设置 View 的背景颜色 BackgroundColor 无效的问题