分布式ID的特性

  • 全局唯一

不能出现重复的ID,这是最基本的要求。

  • 递增

有利于关系数据库索引性能。

  • 高可用

既然是服务于分布式系统,为多个服务提供ID服务,访问压力一定很大,所以需要保证高可用。

  • 信息安全

如果ID是有规律的,就容易被恶意操作,在一些场景下需要ID无规则。

生成方案

UUID

核心思想是结合机器的网卡、当地时间、一个随机数来生成。

优点:

  • 性能非常高,本地生成,没有网络消耗。
  • 生成简单,没有高可用风险。
  • 有利于信息安全,因为可读性差,无规律。

缺点:

  • 太长,不易于存储。
  • 有利于信息安全的同时,也有不安全性,因为基于MAC地址生成的算法可能会泄露MAC地址。
  • 无序,对MySQL索引不利,在 InnoDB 中,无序性会导致数据位置频繁变动,性能低下。

数据库

利用数据库自增ID的特性来生成,如 MySQL 的 auto_increment

优点:

  • 简单,利用数据库自有功能实现。
  • 绝对有序。

缺点:

  • 有重复发号的风险,例如数据库主从切换的场景。
  • 需要特别保障其高可用。
  • 发号性能限制于数据库性能,如需提高发号能力,需要扩充数据库,成本高。

Redis

Redis 提供了自增的原子命令,可以保证唯一、有序。

优点:

  • 简单,自有能力。
  • 高并发环境下性能好,优于数据库。
  • 维护成本低于数据库。

缺点:

  • 主从切换时也可能会重复发号。
  • 需要特别保障其高可用。

雪花算法

给每台机器分配一个唯一标识,然后通过下面的结构实现全局唯一ID:

时间戳 + 机器标识 + 自增序列号

毫秒在高位,自增序列在低位,一定是递增的。

优点:

  • 生成性能高。
  • 灵活,可以根据自身业务特点分配bit位。

缺点:

  • 强依赖机器时钟,如果时钟回拨,就会导致服务异常。

小结

不同的方案有不同的特点,需要根据自己的需求场景来选择适合的。

例如在美团早期,ID方案就是多种形式的:

  • 有的业务通过 DB 自增的方式生成
  • 有的业务通过 Redis 缓存来生成
  • 有的业务直接用 UUID 生成

后来推出了一个类雪花算法的分布式ID服务:Leaf,QPS压测结果近5w/s。

项目地址:

https://github.com/Meituan-Dianping/Leaf

再推荐2个参考项目:

  • 基于 Redis 的生成器

https://github.com/hengyunabc/redis-id-generator

  • 百度基于雪花算法的生成器

https://github.com/baidu/uid-generator

分布式唯一ID的生成方案的更多相关文章

  1. 分布式系统唯一ID的生成方案讨论

    在分布式系统下唯一id问题,就是id咋生成?比如分表分库,因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那是不对的.举个例子,一个表拆分为了2张表,每个表的id都从1开始累加,这个 ...

  2. 讲分布式唯一id,这篇文章很实在

    分布式唯一ID介绍 分布式系统全局唯一的 id 是所有系统都会遇到的场景,往往会被用在搜索,存储方面,用于作为唯一的标识或者排序,比如全局唯一的订单号,优惠券的券码等,如果出现两个相同的订单号,对于用 ...

  3. 分布式唯一ID的几种生成方案

    前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十 ...

  4. 【系统设计】分布式唯一ID生成方案总结

    目录 分布式系统中唯一ID生成方案 1. 唯一ID简介 2. 全局ID常见生成方案 2.1 UUID生成 2.2 数据库生成 2.3 Redis生成 2.4 利用zookeeper生成 2.5 雪花算 ...

  5. 分布式唯一ID生成方案选型!详细解析雪花算法Snowflake

    分布式唯一ID 使用RocketMQ时,需要使用到分布式唯一ID 消息可能会发生重复,所以要在消费端做幂等性,为了达到业务的幂等性,生产者必须要有一个唯一ID, 需要满足以下条件: 同一业务场景要全局 ...

  6. 分布式唯一ID生成算法-雪花算法

    在我们的工作中,数据库某些表的字段会用到唯一的,趋势递增的订单编号,我们将介绍两种方法,一种是传统的采用随机数生成的方式,另外一种是采用当前比较流行的“分布式唯一ID生成算法-雪花算法”来实现. 一. ...

  7. 开源项目|Go 开发的一款分布式唯一 ID 生成系统

    原文连接: 开源项目|Go 开发的一款分布式唯一 ID 生成系统 今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID.上周停更了一周,也是用来开发和测试这个项目的 ...

  8. 分布式唯一id:snowflake算法思考

    匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...

  9. 分布式唯一id生成器的想法

    0x01 起因 前端时间遇到一个问题,怎么快速生成唯一的id,后来采用了hashid的方法.最近在网上读到了美团关于分布式唯一id生成器的解决方案, 其中提到了三种生成法:(建议看一下这篇文章,写得很 ...

随机推荐

  1. Junit 测试集(打包测试)实例

    测试集,直译过来的意思就是把测试集合起来,再详细一些就是把多个单元测试集合起来 .单元测试可以理解为:单个接口 或者单个类/方法 的测试 项目背景:测试基于spring开发的项目代码 实例模板:pac ...

  2. vue项目安装scss,以及安装scss报错(this.getResolve is not a function)

    1.安装scss: npm install node-sass sass-loader vue-style-loader --save-dev //安装node-sass sass-loader vu ...

  3. Linux 内核 EISA 总线

    扩展 ISA (EISA) 总线是一个对 ISA 的 32-位 扩展, 带有一个兼容的接口连接器; ISA 设备板可被插入一个 EISA 连接器. 增加的线在 ISA 接触之下被连接. 如同 PCI ...

  4. 浅谈vue $mount()

    Vue 的$mount()为手动挂载,在项目中可用于延时挂载(例如在挂载之前要进行一些其他操作.判断等),之后要手动挂载上.new Vue时,el和$mount并没有本质上的不同. 具体见代码: 顺便 ...

  5. Centos6.5_x64-GitLab搭建私有GitHub

              GitLab,是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. 它拥有与GitHub类似的功 ...

  6. CSDN博客 专用备份工具

    CSDN博客 专用备份工具 用要的朋友可下载. 本程序为个人所用,仅供学习.作者:潇湘博客网站:http://blog.csdn.NET/fkedwgwy默认文件存放位置为用户名文件夹下,也可以直接自 ...

  7. python实现单词本功能

    #实现简单的单词本:# 可以添加单词和词义,当所添加的单词已经存在 让用户知道:# 查找单词,单词不存在时,让用户知道# 删除单词,当删除的单词不存在时,让用户知道# 以上功能无限制操作,直到用户输入 ...

  8. VUE事件修饰符.passive、.capture、.once实现原理——重新认识addEventListener方法

    https://www.jianshu.com/p/b12d0d3ad4c1 .passive的作用与使用场景 https://juejin.im/post/5ad804c1f265da504547f ...

  9. Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?

    redis 主要有以下几种数据类型: string hash list set sorted set string 这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存. set c ...

  10. 写代码 Log 也要认真点么?

    Log自然是需要的, 尤其是正式的产品; 但如果只是自己或内部用用的小工具, 也需要认真点吗? 实话说, 自己对 log 总是不上心, 总觉得调试好了, 能跑了, 足以. 所以, 被大妈怼了好几次 l ...