分布式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. while循环&CPU占用率高问题深入分析与解决方案

    直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方.使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果, ...

  2. H3C配置console口密码

    方法一: [H3C]user-interface console 0 [H3C-ui-console0]authentication-mode password [H3C-ui-console0]se ...

  3. Canvas学习实践:一款简单的动画游戏

    最近学习了下Canvas绘图...突发奇想就有了下面这款简单的小游戏,纯属娱乐~ 废话不多说,直接上代码: <!DOCTYPE html> <html lang="zh&q ...

  4. JS(JavaScript)的j进一步了解9(更新中···)

    1.动画 (1) Css样式提供了运动 过渡的属性transition  从一种情况到另一种情况叫过渡 Transition:attr  time  linear  delay: Attr 是变化的属 ...

  5. CP策略含有中文字符提交失败故障解决

    硬件平台:CP5600 系统版本:R80.10 补丁版本:TAKE103 故障现象:提交新增策略失败,日志显示 if the problem persists contact Checkpoint S ...

  6. 超简单!pytorch入门教程(五):训练和测试CNN

    我们按照超简单!pytorch入门教程(四):准备图片数据集准备好了图片数据以后,就来训练一下识别这10类图片的cnn神经网络吧. 按照超简单!pytorch入门教程(三):构造一个小型CNN构建好一 ...

  7. 百度DMA+小度App的蓝牙语音解决方案入局

    前记   人机交互经历了三个阶段键鼠.触屏和语音交互.在国外,谷歌.亚马逊.苹果等巨头的竞争已经到达白热化状态:在国内,百度的DuerOS凭借着入局早,投入大,已经成为国内语音互交的一面旗帜.无论是从 ...

  8. Java 连接 SQL Server 数据库

    //连接数据库 public Connection getConnection(){ //url为绝对路径 String url="jdbc:sqlserver://127.0.0.1:14 ...

  9. Gif动图压缩java版

    简单说明下,如果不是压缩动图的话只用java本身的包足够实现压缩和截取图片了,为了能够压缩gif动图,这里引用了两个文件 AnimatedGifEncoder 和 GifDecoder, 先用Deco ...

  10. JavaScript中浅拷贝和深拷贝的区别

    JavaScript数据类型 基础数据类型:保存在栈内存中的简单数据段 ,有undefined,boolean,number,string,null 引用数据类型:Array,object,Funct ...