分布式唯一ID的生成方案
分布式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的生成方案的更多相关文章
- 分布式系统唯一ID的生成方案讨论
在分布式系统下唯一id问题,就是id咋生成?比如分表分库,因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那是不对的.举个例子,一个表拆分为了2张表,每个表的id都从1开始累加,这个 ...
- 讲分布式唯一id,这篇文章很实在
分布式唯一ID介绍 分布式系统全局唯一的 id 是所有系统都会遇到的场景,往往会被用在搜索,存储方面,用于作为唯一的标识或者排序,比如全局唯一的订单号,优惠券的券码等,如果出现两个相同的订单号,对于用 ...
- 分布式唯一ID的几种生成方案
前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十 ...
- 【系统设计】分布式唯一ID生成方案总结
目录 分布式系统中唯一ID生成方案 1. 唯一ID简介 2. 全局ID常见生成方案 2.1 UUID生成 2.2 数据库生成 2.3 Redis生成 2.4 利用zookeeper生成 2.5 雪花算 ...
- 分布式唯一ID生成方案选型!详细解析雪花算法Snowflake
分布式唯一ID 使用RocketMQ时,需要使用到分布式唯一ID 消息可能会发生重复,所以要在消费端做幂等性,为了达到业务的幂等性,生产者必须要有一个唯一ID, 需要满足以下条件: 同一业务场景要全局 ...
- 分布式唯一ID生成算法-雪花算法
在我们的工作中,数据库某些表的字段会用到唯一的,趋势递增的订单编号,我们将介绍两种方法,一种是传统的采用随机数生成的方式,另外一种是采用当前比较流行的“分布式唯一ID生成算法-雪花算法”来实现. 一. ...
- 开源项目|Go 开发的一款分布式唯一 ID 生成系统
原文连接: 开源项目|Go 开发的一款分布式唯一 ID 生成系统 今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID.上周停更了一周,也是用来开发和测试这个项目的 ...
- 分布式唯一id:snowflake算法思考
匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...
- 分布式唯一id生成器的想法
0x01 起因 前端时间遇到一个问题,怎么快速生成唯一的id,后来采用了hashid的方法.最近在网上读到了美团关于分布式唯一id生成器的解决方案, 其中提到了三种生成法:(建议看一下这篇文章,写得很 ...
随机推荐
- Junit 测试集(打包测试)实例
测试集,直译过来的意思就是把测试集合起来,再详细一些就是把多个单元测试集合起来 .单元测试可以理解为:单个接口 或者单个类/方法 的测试 项目背景:测试基于spring开发的项目代码 实例模板:pac ...
- 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 ...
- Linux 内核 EISA 总线
扩展 ISA (EISA) 总线是一个对 ISA 的 32-位 扩展, 带有一个兼容的接口连接器; ISA 设备板可被插入一个 EISA 连接器. 增加的线在 ISA 接触之下被连接. 如同 PCI ...
- 浅谈vue $mount()
Vue 的$mount()为手动挂载,在项目中可用于延时挂载(例如在挂载之前要进行一些其他操作.判断等),之后要手动挂载上.new Vue时,el和$mount并没有本质上的不同. 具体见代码: 顺便 ...
- Centos6.5_x64-GitLab搭建私有GitHub
GitLab,是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. 它拥有与GitHub类似的功 ...
- CSDN博客 专用备份工具
CSDN博客 专用备份工具 用要的朋友可下载. 本程序为个人所用,仅供学习.作者:潇湘博客网站:http://blog.csdn.NET/fkedwgwy默认文件存放位置为用户名文件夹下,也可以直接自 ...
- python实现单词本功能
#实现简单的单词本:# 可以添加单词和词义,当所添加的单词已经存在 让用户知道:# 查找单词,单词不存在时,让用户知道# 删除单词,当删除的单词不存在时,让用户知道# 以上功能无限制操作,直到用户输入 ...
- VUE事件修饰符.passive、.capture、.once实现原理——重新认识addEventListener方法
https://www.jianshu.com/p/b12d0d3ad4c1 .passive的作用与使用场景 https://juejin.im/post/5ad804c1f265da504547f ...
- Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
redis 主要有以下几种数据类型: string hash list set sorted set string 这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存. set c ...
- 写代码 Log 也要认真点么?
Log自然是需要的, 尤其是正式的产品; 但如果只是自己或内部用用的小工具, 也需要认真点吗? 实话说, 自己对 log 总是不上心, 总觉得调试好了, 能跑了, 足以. 所以, 被大妈怼了好几次 l ...