分布式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. H3C端口绑定技术简介

  2. linux 处理器特定的寄存器

    如果你需要测量非常短时间间隔, 或者你需要非常高精度, 你可以借助平台依赖的资源, 一个要精度不要移植性的选择. 在现代处理器中, 对于经验性能数字的迫切需求被大部分 CPU 设计中内在的指令定时不 ...

  3. dotnet 将文件删除到回收站

    默认删除文件的时候 File.Delete 是将文件永久删除,如果是一些文档,建议删除到回收站,这样用户可以自己还原 通过 SHFileOperation 可以将文件放在回收站 本文提供的方法暂时只能 ...

  4. 2018 CCPC 吉林站 H Lovers

    2018 CCPC 吉林站 H Lovers 传送门:https://www.spoj.com/problems/LIS2/en/ 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, ...

  5. Java 学习笔记(10)——容器

    之前学习了java中从语法到常用类的部分.在编程中有这样一类需求,就是要保存批量的相同数据类型.针对这种需求一般都是使用容器来存储.之前说过Java中的数组,但是数组不能改变长度.Java中提供了另一 ...

  6. 记mysql一次莫名的1062错误

    1062 Duplicate entry '...' for key 'PRIMARY指的是主键重复或者唯一索引重复. 本来mysql表中未设主键和唯一索引,准备加上,但是设置的时候总是提示1062, ...

  7. python基础[16]——解决django连接mysql数据库报错的问题

    Models.py #创建数据表 from django.db import models from django.utils import timezone from tinymce.models ...

  8. Linux 学习笔记 4 创建、复制、移动、文件的基本操作

    写在前面 通过上一节的学习,我们基本的了解到在Linux 里面对于设备的挂载.卸载以及设备存在的目录.挂载目录.都有了一个基本的了解 本节主要了解文件.以及目录的相关操作,比如文件.目录的创建.以及删 ...

  9. SpringJDBC的使用(转载)

    转载自   https://www.yiibai.com/spring/maven-spring-jdbc-example.html 工具: eclipse4.7.2及mysql-8.0.13 项目最 ...

  10. 老板让阿粉学习 flink 中的 Watermark,现在他出教程了

    1 前言 在时间 Time 那一篇中,介绍了三种时间概念 Event.Ingestin 和 Process, 其中还简单介绍了乱序 Event Time 事件和它的解决方案 Watermark 水位线 ...