需求

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

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. 2019 GDUT Rating Contest III : Problem C. Team Tic Tac Toe

    题面: C. Team Tic Tac Toe Input file: standard input Output file: standard output Time limit: 1 second M ...

  2. Mybatis最权威的知识点

    1.什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement ...

  3. git提交本地文件到远程仓库及参与的项目仓库

    1.git提交本地文件到组织 1.先再组织中建立个用于存放文件的仓库建然后复制仓库地址: 2.进入要上传的文件的根目录下右击 git Bash 进入git控制台,我要上传的文件如下: 3.进入后: 1 ...

  4. Java并发编程之基础理论

    内存模型   主内存.工作内存与Java堆.栈.方法区并不是同一个层次的内存划分 勉强对应起来 从定义来看,主内存对应Java堆中对象实例数据部分,工作内存对应虚拟机栈中部分区域 从更低层次来说,主内 ...

  5. Java学习之浅析高内聚低耦合

    •前言 如果你涉及软件开发,可能会经常听到 "高内聚,低耦合" 这种概念型词语. 可是,何为 "高内聚,低耦合" 呢? •概念 "高内聚,低耦合&qu ...

  6. 此博客使用的CSS样式详解!

    此博客使用的CSS样式详解! 页面使用的博客园模板为:LuxInteriorLight,可以在博客皮肤里找到. 页首屏蔽广告代码 <script>console.log("顶部标 ...

  7. [二分匹配]Asteroids

    A s t e r o i d s Asteroids Asteroids 题目描述 Bessie wants to navigate her spaceship through a dangerou ...

  8. [hash-bfs]USACO 3.2 Magic Squares 魔板

    魔 板 魔板 魔板 题目描述 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色 ...

  9. Sentinel全局Feign默认熔断设计实现

    写在前面 用XMind画了一张导图记录Spring Cloud Alibaba的学习笔记(源文件对部分节点有详细备注和参考资料,由于太大就没展示全部,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图 ...

  10. Java性能调优实战,覆盖80%以上调优场景

    Java 性能调优对于每一个奋战在开发一线的技术人来说,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 日渐复杂的系统,错综复杂的性能调优,都对Java工程师的技术广度和技术深度提出了更 ...