分布式唯一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生成器的解决方案, 其中提到了三种生成法:(建议看一下这篇文章,写得很 ...
随机推荐
- FatJar技术
概念 将一个jar及其依赖的三方jar全部打到一个包中,这个包即为FatJar. 作用 作用: Jar包隔离,避免Jar冲突. 打包方式 maven-shade-plugin插件: spring-bo ...
- 51nod 1281山峰和旗子
1281 山峰和旗子 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 用一个长度为N的整数数组A,描述山峰和山谷的高度.山峰需要满足 ...
- jQuery 工具类函数-浏览器信息
在jQuery中,通过$.browser对象可以获取浏览器的名称和版本信息,如$.browser.chrome为true,表示当前为Chrome浏览器,$.browser.mozilla为true,表 ...
- java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity
今天想把ssh整合的代码跑起来,控制台就一直在报错,搞了半天!!! Hibernate: select computer0_.computerId as computer1_0_, computer0 ...
- Canal常用配置
Canal 是mysql数据库binlog的增量订阅&消费组件. 基于日志增量订阅&消费支持的业务: 数据库镜像 数据库实时备份 多级索引 (卖家和买家各自分库索引) search b ...
- Channel 9视频整理【6】
GiGi Huang https://channel9.msdn.com/Niners/GiGiHuang
- IIS 6和IIS 7 中设置文件上传大小限制设置方法,两者是不一样的
在IIS 6.0中设置文件上传大小的方法,只要设置httpRuntime就可以了 <system.web> <httpRuntime executionTimeout="3 ...
- 22.json&pickle&shelve
转载:https://www.cnblogs.com/yuanchenqi/article/5732581.html json 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...
- 第二阶段:2.商业需求文档MRD:1.M版本管理
版本管理的例子.V=Version.注意大中小版本的区分.V1.2.2 第一个数字1就是大版本 中间的2就是中版本 末尾的2就是小版本.大版本就是方向的变更,比如我的用户之前主要是面向男性,现在要面向 ...
- while Ture怎么退出全部
while True: #这是一个死循环 如果想要quit出去只能一层一层的退出 比如如果在第三层输入quit会回到第二层 那么有什么方法能够在第三层就退出全部? print("level1 ...