分布式系统唯一ID详解(5大分布式ID方案)

分布式系统唯一ID简介

分布式系统唯一ID通常用于标识和区分不同的数据或实体,例如:数据库记录、消息、事务等。

分布式系统中确保唯一ID的生成是一个关键问题,因为在分布式环境中,多个节点并行生成ID可能导致重复。

 

分布式系统唯一ID的要求

如果要实现分布式唯一ID,必须要满足4大要求:

分布式系统唯一ID详解(5大分布式ID方案)-mikechen

1.唯一性(Uniqueness)

首先,肯定必须满足唯一 的特性,生成的ID在整个分布式系统中必须是全局唯一的,以防止冲突和数据混乱。

2.高性能(High Performance)

其次,生成ID的性能必须要很快,慢了会影响用户体验,不应该成为系统的性能瓶颈,以确保系统的吞吐量和响应时间。

3.可排序性(Sortability)

最后是可递增的,因为有时候要求生成的ID按照时间有序,这在某些场景下是很重要的,例如:按时间顺序存储的日志等。

4.分布式(Distribution)

ID的生成需要在分布式环境下能够正常工作,不同节点生成的ID,也要保证唯一性。

 

分布式系统唯一ID的实现方案

分布式唯一ID的实现方案,主要就包含5类。

如下图所示:

分布式系统唯一ID详解(5大分布式ID方案)-mikechen

 

1.UUID

UUID(Universally Unique Identifier)是一种全球唯一标识符,通常由128位的数字(16个字节)组成。

比如:

550e8400-e29b-41d4-a716-446655440000

优点:

  • 全球唯一性: 基于时间戳和随机数的组合,理论上在全球范围内唯一。
  • 简单使用: 生成UUID的算法是开放的,且无需中心化管理,方便实现。

缺点:

  • 长度较长: UUID通常是128位的,长度较长,可能导致存储空间的浪费。
  • 可读性差: UUID通常是由数字和字母组成的十六进制字符串,不易识别,可读性相对较差。
  • 不支持顺序: 由于UUID的生成算法中包含随机数,因此生成的UUID并不是有序的,这在某些场景下可能不利于排序操作。

 

2.数据库生成ID

数据库生成唯一ID,通常使用自增长列(Auto-increment)来实现。

分布式系统唯一ID详解(5大分布式ID方案)-mikechen

CREATE TABLE your_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    -- other columns
);

优点:

实现简单,不需要手动管理ID的生成过程,由数据库自动维护。

 

缺点:

如果应用程序依赖于单个数据库,数据库的可用性问题可能导致ID生成问题。

ID生成依赖于数据库的实现,不容易在多种数据库系统之间迁移。

还有一个比较大的缺点,就是可用性,严重依赖单台数据库服务器。

 

3.Redis生成ID

在Redis中生成唯一ID,通常可以使用原子操作来保证生成的ID的唯一性。

优点:

  1. 原子性操作: INCR命令是原子性的,保证了在高并发环境下也能够生成唯一的递增ID。
  2. 简单易用: 实现简单,只需要调用Redis的INCR命令即可。
  3. Redis是基于内存的高性能存储系统,生成ID的速度很快。

缺点:

使用这种方案需要依赖于Redis服务,如果Redis出现故障,可能会影响ID的生成。

 

4.利用zookeeper生成唯一ID

zookeeper主要通过其znode数据版本来生成序列号,当客户端在 ZooKeeper 上创建顺序节点时,ZooKeeper会为每个节点分配一个唯一的递增序列。

优点:

ZooKeeper是一个分布式协调服务,适用于分布式环境。

 

缺点:

使用这种方式需要依赖于 ZooKeeper 服务,如果 ZooKeeper 出现故障,可能会影响ID的生成。

相对于一些简单的ID生成方案,使用 ZooKeeper 实现可能较为复杂。

 

5.snowflake雪花算法生成ID

雪花算法(Snowflake Algorithm),是一种用于生成分布式系统中唯一ID的算法,由Twitter公司开发。

雪花算法生成的ID通常是一个64位的整数,如下图所示:

分布式系统唯一ID详解(5大分布式ID方案)-mikechen

主要分为4大序号:

  • 1位: 符号位,始终为0,表示正数。
  • 41位: 时间戳,精确到毫秒级。
  • 10位: 节点ID,用于标识不同的节点(机器)。
  • 12位: 序列号,用于标识同一毫秒内产生的不同ID。

生成的ID,示例如下:

0 11010111011011110010110101001110101101101 001 110110100110

优点:

  1. 唯一性: 雪花算法生成的ID在整个分布式系统内是唯一的。
  2. 趋势递增: 生成的ID是趋势递增的,有利于数据库的索引性能。

 

缺点:

雪花算法依赖于系统时钟,如果时钟回拨,可能导致生成的ID不唯一,这是目前主要的缺点。

所以,尽量不要去回拨时钟,会造成ID不一致。

 

分布式系统唯一ID总结

选择分布式系统唯一ID的方案应根据具体场景需求来决定,UUID简单易用,但较长。

数据库生成ID简单,但可能成为瓶颈,Redis和Zookeeper都提供了分布式特性,但可能存在单点故障。

雪花算法在性能和唯一性方面都有不错的表现,雪花算法也是目前生成分布式唯一ID的主要实现方式,国内很多大厂都是使用该算法的变种。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法