分布式唯一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生成器的解决方案, 其中提到了三种生成法:(建议看一下这篇文章,写得很 ...
随机推荐
- while循环&CPU占用率高问题深入分析与解决方案
直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方.使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果, ...
- H3C配置console口密码
方法一: [H3C]user-interface console 0 [H3C-ui-console0]authentication-mode password [H3C-ui-console0]se ...
- Canvas学习实践:一款简单的动画游戏
最近学习了下Canvas绘图...突发奇想就有了下面这款简单的小游戏,纯属娱乐~ 废话不多说,直接上代码: <!DOCTYPE html> <html lang="zh&q ...
- JS(JavaScript)的j进一步了解9(更新中···)
1.动画 (1) Css样式提供了运动 过渡的属性transition 从一种情况到另一种情况叫过渡 Transition:attr time linear delay: Attr 是变化的属 ...
- CP策略含有中文字符提交失败故障解决
硬件平台:CP5600 系统版本:R80.10 补丁版本:TAKE103 故障现象:提交新增策略失败,日志显示 if the problem persists contact Checkpoint S ...
- 超简单!pytorch入门教程(五):训练和测试CNN
我们按照超简单!pytorch入门教程(四):准备图片数据集准备好了图片数据以后,就来训练一下识别这10类图片的cnn神经网络吧. 按照超简单!pytorch入门教程(三):构造一个小型CNN构建好一 ...
- 百度DMA+小度App的蓝牙语音解决方案入局
前记 人机交互经历了三个阶段键鼠.触屏和语音交互.在国外,谷歌.亚马逊.苹果等巨头的竞争已经到达白热化状态:在国内,百度的DuerOS凭借着入局早,投入大,已经成为国内语音互交的一面旗帜.无论是从 ...
- Java 连接 SQL Server 数据库
//连接数据库 public Connection getConnection(){ //url为绝对路径 String url="jdbc:sqlserver://127.0.0.1:14 ...
- Gif动图压缩java版
简单说明下,如果不是压缩动图的话只用java本身的包足够实现压缩和截取图片了,为了能够压缩gif动图,这里引用了两个文件 AnimatedGifEncoder 和 GifDecoder, 先用Deco ...
- JavaScript中浅拷贝和深拷贝的区别
JavaScript数据类型 基础数据类型:保存在栈内存中的简单数据段 ,有undefined,boolean,number,string,null 引用数据类型:Array,object,Funct ...