分布式唯一ID的生成方案

admin / 开发 / ... / Reads: 52

分布式ID的特性

  • 全局唯一

不能出现重复的ID,这是最基本的要求。

  • 递增

有利于关系数据库索引性能。

  • 高可用

既然是服务于分布式系统,为多个服务提供ID服务,访问压力一定很大,所以需要保证高可用。

  • 信息安全

如果ID是有规律的,就容易被恶意操作,在一些场景下需要ID无规则。

生成方案

UUID

核心思想是结合机器的网卡、当地时间、一个随机数来生成。

优点:

  • 性能非常高,本地生成,没有网络消耗。

  • 生成简单,没有高可用风险。

  • 有利于信息安全,因为可读性差,无规律。

缺点:

  • 太长,不易于存储。

  • 有利于信息安全的同时,也有不安全性,因为基于MAC地址生成的算法可能会泄露MAC地址。

  • 无序,对MySQL索引不利,在 InnoDB 中,无序性会导致数据位置频繁变动,性能低下。

数据库

利用数据库自增ID的特性来生成,如 MySQL 的 auto_increment。

优点:

  • 简单,利用数据库自有功能实现。

  • 绝对有序。

缺点:

  • 有重复发号的风险,例如数据库主从切换的场景。

  • 需要特别保障其高可用。

  • 发号性能限制于数据库性能,如需提高发号能力,需要扩充数据库,成本高。

Redis

Redis 提供了自增的原子命令,可以保证唯一、有序。

优点:

  • 简单,自有能力。

  • 高并发环境下性能好,优于数据库。

  • 维护成本低于数据库。

缺点:

  • 主从切换时也可能会重复发号。

  • 需要特别保障其高可用。

雪花算法

给每台机器分配一个唯一标识,然后通过下面的结构实现全局唯一ID:

时间戳 + 机器标识 + 自增序列号

毫秒在高位,自增序列在低位,一定是递增的。

优点:

  • 生成性能高。

  • 灵活,可以根据自身业务特点分配bit位。

缺点:

  • 强依赖机器时钟,如果时钟回拨,就会导致服务异常。

关于作者

王硕,网名信平,十多年软件开发经验,业余架构师,精通Java/Python/Go等,喜欢研究技术,著有《PyQt 5 快速开发与实战》《Python 3.* 全栈开发》,多个业余开源项目托管在GitHub上,欢迎微博交流。

Comments

Make a comment

Author: admin

Publish at: ...

关于作者

王硕,网名信平,十多年软件开发经验,架构师,熟悉 Java/Python/Go 等,喜欢研究技术,读书,音乐和宅在家里。
专注于研究互联网产品和技术,提供中文精品教程。 本网站与其它任何公司及/或商标无任何形式关联或合作。
Email: xujieiata@163.com

www.ultrapower.com ,王硕的博客,专注于研究互联网产品和技术,提供中文精品教程。 本网站与其它任何公司及/或商标无任何形式关联或合作。