分布式 ID 的实现方案——Java全栈知识(13)

ops/2024/9/23 7:26:26/

分布式 ID 的实现方案

当我们分表的情况下,如何实现全局唯一 ID 也是一个问题,数据库的唯一索引在
分布式 ID 也就是全局唯一 ID 生产方案需要满足以下几个条件:

  1. 高可用
  2. 高性能
  3. 安全性
  4. 自增性
  5. 唯一性

1、UUID

UUID(Universally Unique Identifier)是一种128位的数字标识符,通常用于唯一标识信息。UUID 是由一组六组十六进制数字组成,中间带有连字符,例如:550e8400-e29b-41d4-a716-446655440000。由于其长度和算法的特性,UUID 几乎可以被认为是全球唯一的标识符,因此在分布式系统和数据库中经常被用于生成唯一的标识符。UUID 的生成算法保证了在大多数情况下,生成的 UUID 都是唯一的。
UUID 的组成部分包括:

  1. 时间戳:UUID的前8位包含时间戳的信息。
  2. 时钟序列:UUID的9~10位包含时钟序列的信息。
  3. MAC地址:UUID的11~16位包含计算机的MAC地址。
  4. 随机数:UUID 的后 12 位包含随机数的信息
    首先上述的 5 个条件 UUID 不满足自增性,其次我们在设置数据库主键的时候应该尽量选用较短的字符串,因为 MySQL 索引的特性主键 ID 需要越短性能越好。

2、基于单表做自增主键

既然分表的情况下有每个表生成自增主键会有冲突,那我们就可以使用一张表给所有的表生成自增主键,这样就解决了冲突的问题
也就是所有的表在需要主键的时侯,都到这张表中获取一个自增的 ID,
这样做是可以做到唯一,也能实现自增,但是问题是这个单表就变成整个系统的瓶颈,而且也存在单点问题,一旦也挂了,整个数握库就都无法写入了。
而且这种生成的方式也不满足安全性,由于自增主键的步长为 1 或者是某个固定值,那么在作为商城等订单系统的 ID 时,我有自己的 ID 就可以尝试出来别人其他的订单 ID,非常不安全。

3、基于跨表步长的自增主键

例如我们有 10 张表,我们可以规定 table_01 以 1 开始自增,table_02 以 1000,0001 开始自增,步长为 1000,0000,这样就可以解决冲突和单表瓶颈。
image.png

但是这种自增的方案需要项目初期进行项目存储数量的预估,而且一旦到达上限将很难去扩容。而且同样有上述的安全性的问题。

4、雪花算法

雪花算法也是比较常用的一种分布式 ID 的生成方式,它具有全局唯一、递增、高可用的特点。
雪花算法生成的主键主要由 4 部分组成,1 bit 符号位、41 bit 时间戳位、10 bit 工作进程位以及 12 bit 序列号位。

  • 时间戳占用 41 bit, 精确到毫秒,总共可以容纳约 69 年的时间。
  • 工作进程位占用 10 bit, 其中高位 5 bit 是数据中心 ID, 低位 5 bit 是工作节点 ID, 做多可以容纳 1024个节点。
  • 序列号占用 12 bt, 每个节点每毫秒 0 开始不断累加,最多可以累加到 4095,一共可以产生 4096 个 ID。
    所以,一个雪花算法可以在同一毫秒内最多可以生成 1024 X 4096=4194304 个唯一的 ID
    image.png

雪花算法之所以被广泛使用,主要是因为他有以下优点:

  1. 高性能高可用:生成时不依赖于数据库,完全在内存中生成
  2. 高吞吐:每秒钟能生成数百万的自增 ID
  3. ID 自增:在单个进程中,生成的 ID 是自增的,可以用作数据库主键做范围查询。但是需要注意的是,在集群中是没办法保证一定顺序递增的。
  4. 唯一性:通过雪花算法生成的 ID 都是唯一的
  5. 安全性:通过雪花算法生成的 ID 不能作为破解其他 ID 的基础。

http://www.ppmy.cn/ops/33647.html

相关文章

【Python】使用seaborn包时为什么会用到matplotlib 包(Seaborn 和 Matplotlib的关系)

在使用 Seaborn 进行数据可视化时,经常会涉及到 Matplotlib 包,这是因为 Seaborn 是建立在 Matplotlib 上的一个高级绘图库。以下是几个关键原因说明为什么在使用 Seaborn 的过程中会用到 Matplotlib: 1. 基于 Matplotlib 构建 封装和简化&…

vue3——(模板应用,组件)

模板应用 Vue3 的模板应用和之前的版本基本一致,但是在一些关键点上有所不同。 Composition API Vue3 引入了 Composition API,这是一种全新的 API 设计风格,可以更好地组织代码,提高代码的复用性和可读性。与之前的 Options AP…

第11章 软件工程

这里写目录标题 1.软件过程1.1能力成熟度模型(CMM)1.2能力成熟度模型集成(CMMI)1.3瀑布模型(线性顺序)1.4增量模型1.5演化模型1.5.1原型模型1.5.2螺旋模型 1.6喷泉模型1.7统一过程(UP)模型 2.敏捷方法3.系统设计4.系统测试4.1单元测试(模块测试)4.2集成测试4.3黑盒测试(功能测试…

Mybatis框架

简介 MyBatis是一款优秀的持久层框架,它支持自定义SQL,存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。 入门 一、导…

无公网环境的本地yum源配置

对没有公网环境的场景下,部署一个本地可用的yum源的方法 注:两种方法本质上一样,centos7和centos8的repo文件格式是不一样的,所以在两种方法中用了不用的ISO,需要根据实际需求,结合两种方法进行部署 1.配置…

详细介绍如何使用YOLOv9 在医疗数据集上进行实例分割-含源码+数据集下载

深度学习彻底改变了医学图像分析。通过识别医学图像中的复杂模式,它可以帮助我们解释有关生物系统的重要见解。因此,如果您希望利用深度学习进行医疗诊断,本文可以成为在医疗数据集上微调YOLOv9 实例分割的良好起点。 实例分割模型不是简单地将区域分类为属于特定细胞类型,…

MyScaleDB:SQL+向量驱动大模型和大数据新范式

大模型和 AI 数据库双剑合璧,成为大模型降本增效,大数据真正智能的制胜法宝。 大模型(LLM)的浪潮已经涌动一年多了,尤其是以 GPT-4、Gemini-1.5、Claude-3 等为代表的模型你方唱罢我登场,成为当之无愧的风口…

HNU-人工智能-实验2-简单CSP问题

人工智能-实验2 计科210x 甘晴void 一、实验目的 求解约束满足问题 使用回溯搜索算法求解八皇后问题 二、实验平台 课程实训平台https://www.educoder.net/paths/369 三、实验内容 3.0 题目要求 回溯搜索算法 搜索与回溯是计算机解题中常用的算法,很多问…