通过本文档你将学习到
- 为什么需要分布式全局唯一ID以及分布式ID的业务需求 ?
- ID生成规则部分硬性要求?目标出现了,就知道我们该怎么做了。
- ID号生成系统的可用性要求
- 一般通用方案,大部分我们都是怎么玩这个唯一ID的?
- 王者玩家怎么玩的?
1 为什么需要唯一ID
复杂的分布式西戎中,需要大量的数据和消息进行唯一标识,订单号,用户UID等等,你需要一个全局的唯一的ID。
2 要求
2.1 生成规则的硬性要求:
- 全局唯一
不能出现重复的ID号,既然是唯一标识,这是最基本的要求 - 趋势递增
在MySQL的innoDB引擎中使用的是聚集索引,由于多数RDBMS使用Btree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。 - 单调递增
保证下一个ID大于上一个ID,。为什么? 这个可以参考InnoDB存储引擎的特点,
关于mysql的数据底层是怎么保存数据的,B+树又是什么?可以自己去查看《mysql必知必会》+《MySQL技术内幕:InnoDB存储引擎》 + 极客时间 mysql实战45
《数据结构与算法》详细解释了什么二三树 AVL树 b+树等等
如果不怎么熟悉mysql,一上去就看经典《高性能mysql》你会一脸懵逼。
- 信息安全
如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可 所以在一些应用场景下,需要ID无规则 不规则,让竞争对手不好猜 - 含时间戳
这样就能在开发中快速了解分布式id的生成时间
2.2 生成系统的可用性要求:
- 高可用
发一个获取分布式ID的请求,服务器就要保证99.999%的情况下给我创建一个唯一分布式ID - 低延迟
发一个获取分布式ID的请求,服务器就要快,极速 - 高QPS:10万个的请求同时过来。
假如并发一口气创建分布式ID请求同时杀过来,服务器要顶得住且一下子成功创建10万
3常用的几种方案
你不要一上来就扯用雪花算法,然后分享结束。这就是在扯。当别人问题用什么,你只能回答看业务需求。假如一个项目只有100个用户,你说生成UID,用雪花算法。需要么?直接DB自增不就可以了么?
UUID
如果只考虑唯一性,OK 入数据库性能差?为什么差还得看那几本书。
数据库自增主键
不解释了,低延迟什么高QPS 搞不定,
基于redis生成全局id策略 我们项目种使用的好像就是这个
单机:因为Redis是单线的天生保证原子性,可以使用原子操作INCR和INCRBY来实现
集群
王者
Twitter的分布式自增ID算法snowflake
snowflake
snowflake
snowflake
snowflake
具体时间
具体时间
雪花算法java源码
https://www.jianshu.com/p/2a27fbd9e71a
工作种就是把源码粘贴一下封装下直接用么?不好意思,你想到到别人都想到了,直接有封装好的工具包 maven引入搞起。
糊涂工具包 就是我们每个工程里面都有一些untils包,这个maven引入,几乎你想到的都有。
https://github.com/looly/hutool
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-captcha</artifactId>
<version>5.2.0</version>
</dependency>
核心代码IdGeneratorSnowflake
image.png