面试场景题系列:分布式系统中的唯一ID生成器

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

1.场景需求需求界定

•ID必须是唯一的。

•ID只包含数字。

•ID长为64位。

•ID按日期排序。

•可以每秒生成超过10,000个唯一ID。

2.高层级的设计

在分布式系统中,有多个方法可以用来生成唯一ID。我们考虑的方法有:

•多主复制(Multi-master Replication)。

•通用唯一标识符(Universally Unique Identifier,UUID)。

•工单服务器(Ticket Server)。

•推特的雪花(Snowflake)系统。

我们来看看它们的工作原理以及优缺点。

2.1.多主复制

图-1

这个方法利用了数据库的自增特性。我们并不是把下一个ID加1,而是加k,这里k是正在使用的服务器数量。在图-1中,生成的下一个ID等于同一个服务器上的前一个ID加2。这种方法解决了一些可扩展性问题,因为ID可以随着服务器数量的增加而同步扩展。但是这个方法也有一些重大缺点。

•很难与多个数据中心一起扩展,需要进行额外的同步和协调操作。

•在分布式环境下,多个服务器同时生成ID,可能导致ID并不连续,也即ID并不随时间递增。

•当服务器被添加或者移除时,ID不能很好地随之变化。

2.2 UUID

UUID是另一种获取唯一ID的简单方法。UUID是一个128位的数字,用来标识计算机系统中的信息。UUID重复的概率非常低。这里引用维基百科的说法,“每秒产生10亿个UUID且持续约100年,产生一个重复UUID的概率才达到50%。”。下面是一个UUID的例子:09c93e62-50b4-468d-bf8a-c07e1040bfb2。UUID可以独立地生成而不需要在服务器之间做任何协调。图-2展示了采用UUID的设计。在这个设计中,每个Web服务器都含有一个ID生成器且负责独立地生成ID。

图-2

UUID方法的优点是:

•生成ID很简单。服务器之间不需要任何协调,所以不会有任何同步问题。

•系统易于扩展,因为每个Web服务器只负责生成它们自己使用的ID。ID生成器可以很容易地随Web服务器一起扩展。

其缺点是:

•ID长128位,但是我们要求的是64位。

•ID并不随时间增加。

•ID可能是非数字的。

2.3 工单服务器

工单服务器也是生成唯一ID的重要方法。Flicker研发了工单服务器来生成分布式主键。值得一提的是这个方法的工作原理。这个方法的思想是利用中心化的单数据库服务器(工单服务器)的自增特性(参见图-3)。

图-3

工单服务器方法的优点是:

•ID为数字。

•容易实现,适用于中小型应用。

其缺点是存在单点故障。单个工单服务器意味着,如果这个服务器发生故障,所有依赖于它的系统就都会面临问题。为了避免单点故障,我们可以设置多个工单服务器。但是这会引入新的挑战,比如数据同步问题。

2.4雪花系统

前面介绍了几个ID生成方法的原理,但是这些方法中没有一个满足我们的特定需求,因此我们需要另一种方法。推特的唯一ID生成系统叫作“Snowflake”(雪花),它很有启发性,而且能满足我们的需求。分布解决是个好办法。我们不直接生成一个ID,而是把一个ID分成不同的部分。图-4展示了一个64位ID的构成。

图-4

每个部分的含义如下所述。

•符号位(1位):它始终为数字0,留作未来使用。它有可能被用来区分有符号数和无符号数。

•时间戳(41位):它是从纪元或者自定义纪元开始以来的毫秒数。我们使用Snowflake默认纪元(epoch)1,288,834,974,657,相当于UTC时间2010年11月4日01:42:54。

•数据中心ID(5位):最多可以有32个(25)数据中心。

•机器ID(5位):每个数据中心最多可以有32台(25)机器。

•序列号(12位):对于某个机器/进程,每生成一个ID,序列号就加1。这个数字每毫秒开始时都会被重置为0。

3.深入设计

我们讨论了在分布式系统中设计唯一ID生成器的各种方法,最后选择了基于推特Snowflake ID生成器的方法。接下来,我们进行深入的设计。

图-5

数据中心ID和机器ID通常在起始阶段就选好了,一旦系统运行起来,这两个部分就是固定的。对数据中心ID和机器ID所做的任何更改都需要仔细审查,因为对这些值的意外改动可能会导致ID冲突。时间戳和序列号是在ID生成器运行后才生成的。

3.1时间戳

41位的时间戳是ID中最重要的部分。随着时间的推移,时间戳不断增长,因此ID可以按时间排序。图-6展示了一个例子,将二进制表示的时间戳转换成UTC时间。你也可以用类似的方法把UTC时间转换成二进制表示。

41位能表示的最大时间戳是241-1,即2,199,023,255,551毫秒(ms),约等于69年(计算方法为2,199,023,255,551÷1000÷365÷24÷3600)。这意味着ID生成器可以工作约69年。如果我们把纪元开始时间定制得离今天的日期足够近,就可以延迟溢出时间。69年后,我们需要一个新的纪元时间或者采用别的技术来迁移ID。

图-6

3.2序列号

序列号有12位,相当于4096种组合(212)。这个部分一般是0,除非在1毫秒内同一个服务器生成了多个ID。理论上,一个服务器每毫秒最多生成4096个新ID。

4.总结

在本文中,我们讨论了设计一个唯一ID生成器的不同方法:多主复制、UUID、工单服务器和类似推特Snowflake的唯一ID生成器。我们最后选择了Snowflake,因为它支持我们的所有用例,并且可以在分布式环境中扩展。如果在面试的最后还有一些时间,你可以讨论下面这些议题。

•时钟同步。在我们的设计里,我们假设生成ID的服务器都有同样的时钟。但是,当服务器运行在多核上时,这个假设可能并不成立。在多机器的场景中也存在同样的挑战。时钟同步的解决方案不在本文的讨论范围内;但是,知道这个问题的存在是很重要的。网络时间协议(NTP)是这个问题最流行的解决方案,感兴趣的读者可以参阅维基百科中的“Network Time Protocol”词条。

•调整ID各部分的长度。比如,对于低并发且长时间持续运行的应用,减少序列号部分的长度,增加时间戳部分的长度,生成的ID会更高效。

•高可用性。因为ID生成器是一个非常关键的系统,所以它必须是高可用的。

面试:分布式场景系列 分布式场景各类面试汇总,不足之处,请大家指正!!!!! 阅读详情

相关推荐

JAVA面试分享三百四十三:分布式场景下的事务机制

首先客户端Producer通过sendMessageInTransaction方法发送事务消息,Broker判断是事务消息就将消息topic存入到RMQ_SYS_TRANS_HALF_TOPIC返回给客户端,客户端继续执行逻辑。然后调用endTransaction方法去提交本地事务通过endTransactionOneway将消息提交给Broker端,Broker端通过Code为END_TRANSACTION的处理器去处理消息调用processRequest方法来处理对应的消息,

之乎者也·的博客 1054

分布式分布式场景面试

分布式面试有使用过缓存吗?Redis和Memcached有什么区别?Redis的线程模型?单线程的Redis如何实现高性能的?使用Redis实现过分布式锁吗?什么是分布式锁 有使用过缓存吗?Redis和Memcached有什么区别? redis相比memcached有哪些优势: memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 redis的速度比mem...

寒沨的博客 2800

搞定系统设计:如何设计一个全局唯一 ID 生成器

设计全局唯一 ID 生成器,是系统设计面试中非常典型的目,同时也是实际分布式系统中不可或缺的基础组件。明确需求是关键功能需求:唯一性、高并发、可扩展。非功能需求:容错性、可监控性、可维护性。选择合适的 ID 类型UUID:简单、全局唯一,但不易排序。数据库自增 ID:易用、可排序,但单点瓶颈明显。Snowflake:分布式、高性能、可排序,最适合高并发分布式场景。核心设计思路拆分 ID 组成:时间戳 + 数据中心 ID + 机器 ID + 序列号。

你好,我是橙序员 731

面试必问——分布式场景和设计

为啥 Redis 单线程模型也能效率这么高? 纯内存操作。 核心是基于非阻塞的 IO 多路复用机制。 C 语言实现,一般来说,C 语言实现的程序“距离”操作系统更近,执行速度相对会更快。 单线程反而避免了多线程的频繁上下文切换问,预防了多线程可能产生的竞争问。 redis高可用 redis 主从架构,一主多从 开启 master node 的持久化,开始生成一份 RDB 快照文件全量复制 redis 基于哨兵实现高可用 redis哨兵****哨兵至少需要 3 个实例,来保证自己的健壮性。 集群监控:负责

u010010600的博客 632

面试汇总-分布式(一)

目录 分布式 1、分布式的与缺点 2、谈谈业务中使用分布式场景 3、Session 分布式方案 4、分布式锁的场景及分布是锁的实现方案 5、分布式事务 6、集群与负载均衡的算法与实现 7、说说分库与分表设计、分库与分表带来的分布式困境与应对之策 微服务 1、前后端分离是如何做的 2、如何解决跨域(CSRF) 3、微服务哪些框架 4、你怎么理解 RPC 框架 5、...

gangsijay888的博客 9677

第4章唯一ID生成器——4.3 基于时间戳的趋势递增的唯一ID

时间戳是指计算机维护的从1970年1月1日开始到当前时间经过的秒数,并且随着时间的流逝而逐步递增。几乎所有的编程语言都仅需要一行代码,就可以轻而易举地得到当前时间戳,并支持毫秒精度,甚至是纳秒精度。时间戳自增的属性非常适合生成趋势递增的唯一ID

qq_45832461的博客 905

Java面试场景及答案总结(2025版持续更新)

Java面试不仅考察知识点的记忆,更注重解决问的能力。建议读者在理解这些场景的基础上,结合实际项目经验进行思考。需要这份Java面试(2025版)文档的小伙伴,观住+留“求资料”免费领取!

2501_91715693的博客 5562

全局ID生成器:从零到精通,揭秘大厂核心技术

分布式系统中,全局唯一 ID 的生成是一个看似简单却至关重要的问。无论是电商订单号、用户 ID,还是支付交易号,都需要一个全局唯一且有序的 ID 来标识每个业务操作。全局唯一 ID 的生成是分布式系统中的核心技术之一。不同的方法有不同的优缺点和适用场景,选择合适的方案需要综合考虑系统的性能、可用性和复杂性。的常见实现方法,包括它们的原理、实现代码、优缺点及适用场景。适用于高并发、分布式场景下的 ID 生成,如订单号、消息队列等。适用于需要全局唯一但对顺序无要求的场景,如文件存储、日志系统。

Leaton的博客 913

Java面试必备:深挖两大高频场景的设计与实现

深入探讨分布式ID生成与线程安全LRU缓存的设计精髓作为Java开发者,面试中我们经常面临既考察基础又挑战实战能力的技术。这类目往往围绕具体应用场景展开,要求我们展示出对Java核心技术、设计模式和系统架构的深刻理解。本文将深入分析Java面试中最常见但极易被忽视的两大场景,揭示背后的设计思想与技术实现。获取方式:si我【666】即可获得完整资料下载链接。

sheep404的博客 914

你知道有多少种方式可以生成全局唯一 id

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 1115

后端开发面试高频场景&设计】深度解析(万字干货)| 面试通关必备

后端面试高频场景与设计解析 摘要:本文针对后端开发面试中的核心型——场景与设计,系统梳理了高频考察点及解决方案。重点分析了缓存三大问(穿透/击穿/雪崩)、分布式事务方案(2PC/TCC/SAGA等)和接口限流策略(计数器/滑动窗口/漏桶/令牌桶算法),从问定义、产生原因到技术解决方案进行深度对比。文章采用表格化呈现方式,清晰展示不同场景下的技术选型考量,帮助候选人掌握业务问拆解、技术方案设计和风险预判等核心能力,提升面试表现。

独立思考,明辨是非 1512

深挖两大高频场景的设计与实现|Java面试核心考点

深入探讨分布式ID生成与线程安全LRU缓存的设计精髓作为Java开发者,面试中我们经常面临既考察基础又挑战实战能力的技术。这类目往往围绕具体应用场景展开,要求我们展示出对Java核心技术、设计模式和系统架构的深刻理解。本文将深入分析Java面试中最常见但极易被忽视的两大场景,揭示背后的设计思想与技术实现。获取方式:si我【666】即可获得完整资料下载链接。

x1ao_fe1的博客 944

唯一ID生成器」的 6 种生成方案

概述: 全局唯一Id几乎是所有系统都会遇到的刚需,这个id在搜索,存储数据,加快检索速度,等等,狠多方面都有重要的意义,有多重策略获取这个唯一id,针对常见的几种场景,我在这里进行简单的总结简单分析下需求 所谓全局的唯一id其实往往对应是生成唯一的标识业务需求. 这个id常常是数据库的主键,数据库上会建立聚集索引(Cluster Index),既在物理存储上以这个字段排序,这个记录标识上的查询,往往有分页或者排序的业务需求,所以往往需要有一个time字段,并且time字段上建立的普通索引(non-Cl

xiaoxiaode_shu的博客 2201

Java面试进大厂,千万级唯一ID是怎么生成的?

今天的话,要给大家分享的大厂面试是:千万级唯一ID如何生成?!看起来这是一个非常具体的问,没错!分布式项目中,无法避免这个问,但是我想说的是,面试官通过打开这个问,是可以从这个角度了解面试者在分布式应用中是否有丰富经验的,分布式大型项目才会有这个问吧,看似一个具体的问,背后却是面试官密谋最佳人选的经验,今天威哥就来聊一聊这个话。 为了让小伙伴们有身临其境的感觉,威哥会以场景化的面试方式来讲解,小伙伴们准备好了吗,马上开整。 首先来看一下互联网大厂必问 : 做过分布式项目吗?

qq_43650522的博客 852

分布式唯一ID生成器」的 6 种生成方案

点击关注公众号,利用碎片时间学习全局唯一ID 几乎是所有系统都会遇到的刚需。这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义。有多种策略来获取这个全局唯一id,针对常见的几种场景,我在这里进行简单的总结和对比。简单分析一下需求所谓全局唯一id 其实往往对应是生成唯一记录标识的业务需求。这个 id 常常是数据库的主键,数据库上会建立聚集...

Java笔记虾 2132

Java面试场景大全精简版

【代码】Java面试场景大全精简版。

2301_81193552的博客 1282

2025年金九银十:Java后端面试场景攻略(附高频库)

设计推荐场景专用Prompt(如“生成10个适合用户的手机推荐”)Service Mesh(Istio)动态调整流量比例。新特性(虚拟线程、Record模式匹配)成为必考点。(如“如何设计一个支持10万QPS的短链系统?:如何用大语言模型(LLM)优化商品推荐系统?设计占比提升(秒杀、支付、推荐系统)(K8s+Serverless)和。(LLM+向量搜索)进入面试库。(LeetCode中等难度起步):通过HTTP Header(如。预留实例(避免冷启动延迟)(1-2轮纯架构设计)

2501_91139003的博客 1067

面试官:高并发下,如何保证分布式唯一全局 ID 生成?

前言系统唯一ID是我们在设计一个系统的时候常常会遇见的问,也常常为这个问而纠结。这篇文章就是给各位看官提供一个生成分布式唯一全局id生成方案的思路,希望能帮助到大家。不足之处,请多多指教!!问为什么需要分布式全局唯一ID以及分布式ID的业务需求在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识,如在美团点评的金融、支付、餐饮、酒店猫眼电影等产品的系统中数据逐...

912
上一篇: 提示词工程教程(三):约束和引导生成
下一篇: 提示词工程教程(四):思维链(CoT)
橙狮科技
博客等级 码龄6年 1159粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值