需求

  • 全局唯一
  • 高性能
  • 高可用
  • 简单易用

UUID

优点:

  • 唯一
  • 不依赖于任何第三方服务

缺点:

  • 是字符串类型而非数字,不满足数字ID的需求
  • 字符串太长了,DB查询效率受影响

数据库自增ID

如果使用 mysql 单实例:性能可能不够;单实例的稳定性不强,宕机会影响业务

如何解决稳定性问题呢?

方案一:使用主从模式集群

存在的问题:满足了高可用,但数据同步延时问题可能导致ID重复。

方案二:使用多主机主从模式集群,对多主机做高可用

必须设置自增起始值与步长

举例:比如两个主机 master1 只会产生奇数ID,master2 只会产生偶数ID

存在的问题:

  • 性能依旧不足,每次都去请求数据库
  • 如果再新增一个主,扩展起来麻烦

如何解决性能问题呢?

方案三:使用号段模式,批量从数据库获取ID缓存起来,缓存中的ID一旦达到上限就再次去数据库批量获取

DB设计如下:

  • biz_type 代表业务类型,业务隔离
  • max_id 代表当前最大的可用 id
  • step 代表号段的长度,合理设置即可
  • version 是一个乐观锁,用来保证并发更新的正确性

最终方案

最终方案结合方案二和方案三的优点,DB设计如下:

  • delta 表示缓存中的 ID 每次增量
  • remainder 代表余数

缺点:

  • 扩展主机个数麻烦
  • 实现复杂

雪花算法

  • 使用一个 long 类型作为 ID
  • 64位:第一位0表示正数 + 41位毫秒级时间戳 + 10位主机编号 + 12位序列号
  • 时间戳通常是相对时间,这样可用期限就更长,理论上支持 69 年
  • 支持 1024-1=1023 个主机节点
  • 支持同一个时间点同一台服务器生成 4096-1=4095 个序列号

主机编号手动分配太麻烦了,可以在 Zookeeper 中创建序列节点,用节点序号(缓存起来)作为主机编号。

优点:快


相关文章:

https://www.liaoxuefeng.com/article/1280526512029729

https://www.cnblogs.com/wuneng/p/11478160.html

https://github.com/didi/tinyid/wiki/tinyid原理介绍

https://mp.weixin.qq.com/s/hz7TntFDurwkAaSGODbF-Q

分布式ID的更多相关文章

  1. 一种基于Orleans的分布式Id生成方案

    基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerat ...

  2. 细聊分布式ID生成方法

    细聊分布式ID生成方法 https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=403837240&idx=1&sn=ae9 ...

  3. spring boot / cloud (十六) 分布式ID生成服务

    spring boot / cloud (十六) 分布式ID生成服务 在几乎所有的分布式系统或者采用了分库/分表设计的系统中,几乎都会需要生成数据的唯一标识ID的需求, 常规做法,是使用数据库中的自动 ...

  4. 每秒生成一千万个【可视有序】分布式ID的简单方案

    去年做了一个产品,会经常导入导出大量的外部数据,这些数据的ID有的是GUID类型,有的是字符串,也有的是自增.GUID类型没有顺序,结果要排序得借助其它业务字段,整体查询效率比较低:字符串ID本来是用 ...

  5. c#分布式ID生成器

    c#分布式ID生成器   简介 这个是根据twitter的snowflake来写的.这里有中文的介绍. 如上图所示,一个64位ID,除了最左边的符号位不用(固定为0,以保证生成的ID都是正数),还剩余 ...

  6. 分布式ID方案有哪些以及各自的优劣势,我们当如何选择

    作者介绍 段同海,就职于达达基础架构团队,主要参与达达分布式ID生成系统,日志采集系统等中间件研发工作. 背景 在分布式系统中,经常需要对大量的数据.消息.http请求等进行唯一标识,例如:在分布式系 ...

  7. Leaf——美团点评分布式ID生成系统 UUID & 类snowflake

    Leaf——美团点评分布式ID生成系统 https://tech.meituan.com/MT_Leaf.html

  8. 分布式ID生成系统 UUID与雪花(snowflake)算法

    Leaf——美团点评分布式ID生成系统 -https://tech.meituan.com/MT_Leaf.html 网游服务器中的GUID(唯一标识码)实现-基于snowflake算法-云栖社区-阿 ...

  9. id生成器,分布式ID自增算法(Snowflake 算法)

    接口: /** * id生成器 */ public interface IdGenerator { String next(); } 实现类: /** * 分布式ID自增算法<br/> * ...

  10. 分布式Id教程

    转自:https://baijiahao.baidu.com/s?id=1584913615817222458&wfr=spider&for=pc 一,题记 所有的业务系统,都有生成I ...

随机推荐

  1. Comet OJ - Contest #9 & X Round 3 【XR-3】核心城市 【树的理解】

    一.题目 [XR-3]核心城市 二.分析 题意就是在树中确定$K$个点,满足剩下的$N-K$个点中到这$K$个点的最大距离尽可能小. 理解上肯定是确定一个根,这个根是这个图的中心. 可以通过根据结点的 ...

  2. jqgrid 实现表格随select框内容改变而刷新

    要实现的功能如下:当选择框选择数据源由原始数据切换到组合后数据时,界面左侧jqgrid表格随之改变.效果如下: 实现代码: 界面顶部select选择框:要点是用localStory将选择框的选择信息记 ...

  3. Spring(一):Spring概述及相关概念

    Spring简介 Spring主要作用是用来解耦,降低代码之间的耦合度.根据功能的不同,可以将系统的代码分为主业务逻辑与系统服务逻辑. 主业务逻辑之间代码联系紧密,相互调用较多,复用性相对较低: 系统 ...

  4. PTA 统计二叉树度为2的结点个数

    6-4 统计二叉树度为2的结点个数 (11 分)   本题要求实现一个函数,可统计二叉树中度为2的结点个数. 函数接口定义: int NodeCount ( BiTree T); T是二叉树树根指针, ...

  5. async await Task 使用方法

    使用概述 C#的使用过程中,除了以前的Thread.ThreadPool等用来开一个线程用来处理异步的内容.还可以使用新特性来处理异步.比以前的Thread和AutoResetEvent.delege ...

  6. Alluxio+HDFS+MapReduce集成及测试

    目录 1.在 HDFS 上配置 Alluxio 1.1.节点角色 1.2.软件版本 1.3.准备工作 1.3.1.设置 SSH 免密登录 1.3.2.安装 JDK 1.3.3.安装 Hadoop 1. ...

  7. kong更改日志格式

    基于业务的需求,需要对网关层的日志进行适当定制,以满足使用kibana的制图. 对于kong的日志格式更改,可查看到的资料都过于繁琐,特此记录. 修改kong的日志格式 # ctl edit depl ...

  8. Python基础(十三):for循环

    对于一个序列,比如说:列表.字符串,有时候我们需要获取其中的每一个元素,然后执行某个操作,此时就需要借助于for循环. for循环语法结构 for循环的语法结构如下,这里大家必须清楚一点,for循环后 ...

  9. BUAA_OS lab3 难点梳理

    BUAA_OS lab3 难点梳理 实验难点 进程创建 对于初始化部分,首先需要在pmap.c中修改mips_vm_init()函数,为envs开空间,并map到UENVS空间. 其次,模仿page_ ...

  10. 记一次metasploitable2内网渗透之1524端口

    0x01.漏洞 许多攻击脚本将安装一个后门SHELL于这个端口,尤其是针对SUN系统中Sendmail和RPC服务漏洞的脚本.如果刚安装了防火墙就看到在这个端口上的连接企图,很可能是上述原因.可以试试 ...