需求

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

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. java重写toString()方法

    toString()方法是Object类的方法,调用toString()会返回对象的描述信息. 1)为什么重写toString()方法呢? 如果不重写,直接调用Object类的toString()方法 ...

  2. webpack核心模块tapable用法解析

    前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...

  3. Cookie与Session的安全性

    说到cookie与session我们首先要说一下为什么要引入这两个东西,这两个多西到底是干什么的 起源 由于HTTP协议使无状态的: 每一次请求都是新的请求,不会记得之前通信的状态 客户端与服务端的一 ...

  4. windows使用vscode设置免密登录linux服务器

    秘钥原理解释 id_rsa.pub是公钥,部署在服务器上 id_rsa是私钥,放在windows本地 本质上它们都是个文本文件 操作流程 生成秘钥对(windows和linux均可) ssh-keyg ...

  5. python3 elf文件解析

    原地址:https://github.com/guanchao/elfParser 作者是用python2写的,现在给出我修改后的python3版本.(测试发现有bug,以后自己写个,0.0) 1 # ...

  6. 别再面向 for 循环编程了,JDK 自带的观察者模式就很香!

    大家好,你还在面向 for 循环编程吗? 还有谁不会用观察者模式吗? 本篇栈长带来<观察者模式>理论及实战- 什么是观察者模式? 观察者模式(Observer Pattern)定义了对象间 ...

  7. irace package -- 参数调优神器

    目录 1. irace 是什么 2. 安装 irace 3. irace 的运行机制 4. irace 的配置环境 4.1. parameters 4.2. target algorithm runn ...

  8. Qt信号槽源码剖析(二)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...

  9. Kubernetes网络概念初探

    ------------恢复内容开始------------ Kubernetes网络是Kubernetes中一个核心概念.简而言之,Kubernetes网络模型可以确保集群上所有Kubernetes ...

  10. 京东效率专家带你快速落地DevOps

    行业内的公司纷纷在招聘DevOps工程师,企业的DevOps转型看起来迫在眉睫,公司内部也要设计和开发DevOps平台,DevOps已经成为了所有IT从业人员应知应会的必备技能. 为你提供一套清晰的D ...