分布式ID

分布式ID

日常开发中,数据需要使用唯一的ID来标识,一般情况下使用自增主键作为数据ID。但是在大数量的情况下,往往会引入分库分表,这时自增ID已经无法满足需求了,就需要一个能够生成全局唯一ID的系统。

一些常见的分布式ID生成策略有:UUID、雪花算法(Twitter的Snowflake)、基于Redis的ID生成方案等。具体选择哪种方案,需要根据系统的实际需求来决定。

UUID

UUID全称:Universally Unique Identifier,即通用唯一识别码。

UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为16^32 = 2^128,约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。

UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符

如:550e8400-e29b-41d4-a716-446655440000。

JAVA中生成一个UUID:

java 复制代码
System.out.println(UUID.randomUUID().toString());

优点

  1. 全局唯一,重复率低
  2. 无需中央协调机制
  3. 安全性高

缺点

  1. 占用空间大
  2. 不易读懂
  3. 不适合顺序访问
  4. 算法复杂影响性能

雪花算法

雪花算法是Twitter开源的一种生成全局唯一的ID的算法,SnowFlake中文意思为雪花,故称为雪花算法,它主要用于在分布式系统中生成唯一ID,保证数据整体有序。雪花算法的核心思想是通过使用一个64位的整数来表示最终生成的唯一ID,这个整数由以下几个部分组成:

  1. 符号位(1 bit):雪花算法中符号位一直为0,表示生成的ID为正数。
  2. 时间戳(41 bits):时间戳部分占用了ID的高位41个二进制位。这个时间戳记录的是自定义起始时间点(如对于Twitter而言是"2010年11月4日8:43:00",对于美团而言是"2015年1月1日")到现在的毫秒数,最多可以支持69年的时间戳。因此,雪花算法生成的ID可按照时间有序递增或递减,便于存储和索引。
  3. 机器ID(10 bits):机器ID部分占用了ID的中间10个二进制位,包括5位datacenterId和5位workerId。它可以指定不同的机器节点,也就是可以支持1024台不同的机器。
  4. 序列号(12 bits):序列号部分占用了ID的最后12个二进制位。它表示同一毫秒内不同的ID序列号,每毫秒可以生成4096个序列号。所以,如果同一机器同一毫秒内请求并发量超过了4096次,会出现序列号重复的情况。
  5. 总计64位:这个ID总共占据64个二进制位,如果把它转成16进制,就是一个16个字符长度的字符串。这个64位的ID可以被用于全局唯一标识分布式系统中的每一个元素。

雪花算法的实现原理相对简单,不需要依赖网络和第三方存储系统,也不存在单点故障问题。同时,由于它生成的ID是全局唯一且有序的,非常适合在分布式系统中进行唯一性约束,比如数据库表的主键等场景。但是,在使用雪花算法时需要注意,如果某些节点的时钟不够同步,可能导致生成的ID不是严格有序的,因此需要保证各个节点的时钟同步。

优点

  1. 生成效率高
  2. 不重复
  3. 算法简单

缺点

  1. 依赖系统时钟,会出现时钟回拨问题。
  2. 单机递增,但是分布式不递增。

时钟回拨

时间回拨就是服务器上的时间突然倒退到之前的时间。

解决办法:

由于强依赖时钟,对时间的要求比较敏感,在机器工作时NTP同步也会造成秒级别的回退,建议可以直接关闭NTP同步。要么在时钟回拨的时候直接不提供服务直接返回ERROR_CODE,等时钟追上即可。或者做一层重试,然后上报报警系统,更或者是发现有时钟回拨之后自动摘除本身节点并报警

Redis的ID生成方案

相关推荐
无忧智库35 分钟前
港口行业数字化转型:智慧港航信息化管理平台解决方案(PPT)
分布式·微服务·架构
isNotNullX1 小时前
数据仓库是什么?怎么搭建数据仓库?
大数据·分布式·spark
爱学习的小囧1 小时前
ESXi 8.0 vSwitch与dvSwitch(分布式交换机)核心区别
服务器·开发语言·分布式·php·虚拟化
星晨雪海1 小时前
Redis 分布式 ID 生成器
数据库·redis·分布式
REDcker1 小时前
RabbitMQ系列01 - 消息中间件与 MQ:在分布式系统里解决什么问题
分布式·rabbitmq
Albert Edison1 小时前
【RabbitMQ】七种工作模式
java·开发语言·分布式·rabbitmq
☞遠航☜1 小时前
rabbitmq 创建延迟队列
分布式·rabbitmq
Rick19931 小时前
RabbitMQ 死信队列(DLX)
分布式·rabbitmq
REDcker1 小时前
RabbitMQ系列02 - RabbitMQ 消息模型:Broker、交换器、队列与收发路径
分布式·rabbitmq·ruby
飞Link1 小时前
LangGraph SDK 全量技术手册:分布式 Agent 集群的远程调用与编排引擎
开发语言·分布式·python·数据挖掘