• 分布式 ID


    何为分布式 ID?

    分布式 ID 是分布式系统下的 ID。分布式 ID 不存在与现实生活中,属于计算机系统中的一个概念。

    我简单举一个分库分表的例子。

    我司的一个项目,使用的是单机 MySQL 。但是,没想到的是,项目上线一个月之后,随着使用人数越来越多,整个系统的数据量将越来越大。

    单机 MySQL 已经没办法支撑了,需要进行分库分表(推荐 Sharding-JDBC)。

    在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了。我们如何为不同的数据节点生成全局唯一主键呢?

    这个时候就需要生成分布式 ID了。

    #要分布式 ID 需要满足哪些要求?

    分布式 ID 作为分布式系统中必不可少的一环,很多地方都要用到分布式 ID。

    一个最基本的分布式 ID 需要满足下面这些要求:

    • 全局唯一 :ID 的全局唯一性肯定是首先要满足的!
    • 高性能 : 分布式 ID 的生成速度要快,对本地资源消耗要小。
    • 高可用 :生成分布式 ID 的服务要保证可用性无限接近于 100%。
    • 方便易用 :拿来即用,使用方便,快速接入!

    除了这些之外,一个比较好的分布式 ID 还应保证:

    • 安全 :ID 中不包含敏感信息。
    • 有序递增 :如果要把 ID 存放在数据库的话,ID 的有序性可以提升数据库写入速度。并且,很多时候 ,我们还很有可能会直接通过 ID 来进行排序。
    • 有具体的业务含义 :生成的 ID 如果能有具体的业务含义,可以让定位问题以及开发更透明化(通过 ID 就能确定是哪个业务)。
    • 独立部署 :也就是分布式系统单独有一个发号器服务,专门用来生成分布式 ID。这样就生成 ID 的服务可以和业务相关的服务解耦。不过,这样同样带来了网络调用消耗增加的问题。总的来说,如果需要用到分布式 ID 的场景比较多的话,独立部署的发号器服务还是很有必要的。

    #分布式 ID 常见解决方案

    1,数据库主键自增

    这种方式的优缺点也比较明显:

    • 优点 :实现起来比较简单、ID 有序递增、存储消耗空间小
    • 缺点 : 支持的并发量不大、存在数据库单点问题(可以使用数据库集群解决,不过增加了复杂度)、ID 没有具体业务含义、安全问题(比如根据订单 ID 的递增规律就能推算出每天的订单量,商业机密啊! )、每次获取 ID 都要访问一次数据库(增加了对数据库的压力,获取速度也慢)

    2,数据库号段模式

    数据库号段模式的优缺点:

    • 优点 :ID 有序递增、存储消耗空间小
    • 缺点 :存在数据库单点问题(可以使用数据库集群解决,不过增加了复杂度)、ID 没有具体业务含义、安全问题(比如根据订单 ID 的递增规律就能推算出每天的订单量,商业机密啊! )

    3,NoSQL          一般情况下,NoSQL 方案使用 Redis 多一些。我们通过 Redis 的 incr 命令即可实现对 id 原子顺序递增

    Redis 方案的优缺点:

    • 优点 : 性能不错并且生成的 ID 是有序递增的
    • 缺点 : 和数据库主键自增方案的缺点类似
    • MongoDB 方案的优缺点:

    • 优点 : 性能不错并且生成的 ID 是有序递增的
    • 缺点 : 需要解决重复 ID 问题(当机器时间不对的情况下,可能导致会产生重复 ID) 、有安全性问题(ID 生成有规律性)

    算法

    #UUID

    UUID 是 Universally Unique Identifier(通用唯一标识符) 的缩写。UUID 包含 32 个 16 进制数字(8-4-4-4-12)。

    JDK 就提供了现成的生成 UUID 的方法,一行代码就行了。

    最后,我们再简单分析一下 UUID 的优缺点 (面试的时候可能会被问到的哦!) :

    • 优点 :生成速度比较快、简单易用
    • 缺点 : 存储消耗空间大(32 个字符串,128 位) 、 不安全(基于 MAC 地址生成 UUID 的算法会造成 MAC 地址泄露)、无序(非自增)、没有具体业务含义、需要解决重复 ID 问题(当机器时间不对的情况下,可能导致会产生重复 ID)

    Snowflake(雪花算法)

    Snowflake 是 Twitter 开源的分布式 ID 生成算法。Snowflake 由 64 bit 的二进制数字组成,这 64bit 的二进制被分成了几部分,每一部分存储的数据都有特定的含义

    我们再来看看 Snowflake 算法的优缺点 :

    • 优点 :生成速度比较快、生成的 ID 有序递增、比较灵活(可以对 Snowflake 算法进行简单的改造比如加入业务 ID)
    • 缺点 : 需要解决重复 ID 问题(依赖时间,当机器时间不对的情况下,可能导致会产生重复 ID)。

  • 相关阅读:
    外连接,exists存在,(DML):用SQL录入数据,用SQL删除数据,用SQL更新数据
    k8s:endpoint
    【Jmeter 简单使用】
    Java多并发(一)| 并发机制的底层原理(内存模型、重排序)
    外星人:可惜,地球人的AI科技树长歪了!
    C# new 和 override 的区别
    【电源专题】案例:电感电流测试异常难道就一定是电路参数的问题?
    win11怎么回去win10?四种方法教你!
    axios使用
    论文管理系统(增删查改功能的实现)
  • 原文地址:https://blog.csdn.net/zcx12ZCX/article/details/126569531