谈谈常用的分布式ID的设计方案?

news2024/12/23 8:57:01

典型回答

首先,我们需要明确通常的分布式ID定义,基本的要求包括:

  • 全局唯一,区别于单点系统的唯一,全局是要求分布式系统内唯一。

  • 有序性,通常都需要保证生成的ID是有序递增的。例如,在数据库存储等场景中,有序ID便于确定数据位置,往往更加高效。

目前业界的方案很多,典型方案包括:

  • 基于数据库自增序列的实现。这种方式优缺点都非常明显,好处是简单易用,但是在扩展性和可靠性等方面存在局限性。

  • 基于Twitter早期开源的Snowflake的实现,以及相关改动方案。这是目前应用相对比较广泛的一种方式,其结构定义你可以参考下面的示意图。

  • 在这里插入图片描述整体长度通常是64 (1 + 41 + 10+ 12 = 64)位,适合使用Java语言中的long类型来存储。

头部是1位的正负标识位。

紧跟着的高位部分包含41位时间戳,通常使用System.currentTimeMillis()。

后面是10位的WorkerID,标准定义是5位数据中心 + 5位机器ID,组成了机器编号,以区分不同的集群节点。

最后的12位就是单位毫秒内可生成的序列号数目的理论极限。
Snowflake的官方版本是基于Scala语言,Java等其他语言的参考实现有很多,是一种非常简单实用的方式,具体位数的定义是可以根据分布式系统的真实场景进行修改的,并不一定要严格按照示意图中的设计。

  • Redis、ZooKeeper、MongoDB等中间件,也都有各种唯一ID解决方案。其中一些设计也可以算作是Snowflake方案的变种。例如,MongoDB的ObjectId提供了一个12 byte(96位)的ID定义,其中32位用于记录以秒为单位的时间,机器ID则为24位,16位用作进程ID,24位随机起始的计数序列。

  • 国内的一些大厂开源了其自身的部分分布式ID实现,InfoQ就曾经介绍过微信的seqsvr,它采取了相对复杂的两层架构,并根据社交应用的数据特点进行了针对性设计,具体请参考相关代码实现。另外,百度、美团等也都有开源或者分享了不同的分布式ID实现,都可以进行参考。

考点分析

涉及分布式,很多单机模式下的简单问题突然就变得复杂了,这是分布式天然的复杂性,需要从不同角度去理解适用场景、架构和细节算法,我会从下面的角度进行适当解读:

  • 我们的业务到底需要什么样的分布式ID,除了唯一和有序,还有哪些必须要考虑的要素?

  • 在实际场景中,针对典型的方案,有哪些可能的局限性或者问题,可以采取什么办法解决呢?

知识扩展

如果试图深入回答这个问题,首先需要明确业务场景的需求要点,我们到底需要一个什么样的分布式ID?

需求要点

除了唯一和有序,考虑到分布式系统的功能需要,通常还会额外希望分布式ID保证:

  • 有意义,或者说包含更多信息,例如时间、业务等信息。这一点和有序性要求存在一定关联,如果ID中包含时间,本身就能保证一定程度的有序,虽然并不能绝对保证。ID中包含额外信息,在分布式数据存储等场合中,有助于进一步优化数据访问的效率。

  • 高可用性,这是分布式系统的必然要求。前面谈到的方案中,有的是真正意义上的分布式,有得还是传统主从的思路,这一点没有绝对的对错,取决于我们业务对扩展性、性能等方面的要求。

  • 紧凑性,ID的大小可能受到实际应用的制约,例如数据库存储往往对长ID不友好,太长的ID会降低MySQL等数据库索引的性能;编程语言在处理时也可能受数据类型长度限制。

在具体的生产环境中,还有可能提出对QPS等方面的具体要求,尤其是在国内一线互联网公司的业务规模下,更是需要考虑峰值业务场景的数量级层次需求。

主流方案的优缺点分析

对于数据库自增方案,除了实现简单,它生成的ID还能够保证固定步长的递增,使用很方便。

但是,因为每获取一个ID就会触发数据库的写请求,是一个代价高昂的操作,构建高扩展性、高性能解决方案比较复杂,性能上限明显,更不要谈扩容等场景的难度了。与此同时,保证数据库方案的高可用性也存在挑战,数据库可能发生宕机,即使采取主从热备等各种措施,也可能出现ID重复等问题。

实际大厂商往往是构建了多层的复合架构,例如美团公开的数据库方案Leaf-Segment,引入了起到缓存等作用的Leaf层,对数据库操作则是通过数据库中间件提供的批量操作,这样既能保证性能、扩展性,也能保证高可用。但是,这种方案对基础架构层面的要求很多,未必适合普通业务规模的需求。

与其相比,Snowflake方案的好处是算法简单,依赖也非常少,生成的序列可预测,性能也非常好,比如Twitter的峰值超过10万/s。

但是,它也存在一定的不足,例如:

  • 时钟偏斜问题(Clock Skew)。我们知道普通的计算机系统时钟并不能保证长久的一致性,可能发生时钟回拨等问题,这就会导致时间戳不准确,进而产生重复ID。
    针对这一点,Twitter曾经在文档中建议开启NTP,毕竟Snowflake对时间存在依赖,但是也有人提议关闭NTP。我个人认为还是应该开启NTP,只是可以考虑将stepback设置为0,以禁止回调。
    从设计和具体编码的角度,还有一个很有效的措施就是缓存历史时间戳,然后在序列生成之前进行检验,如果出现当前时间落后于历史时间的不合理情况,可以采取相应的动作,要么重试、等待时钟重新一致,或者就直接提示服务不可用。

  • 另外,序列号的可预测性是把双刃剑,虽然简化了一些工程问题,但很多业务场景并不适合可预测的ID。如果你用它作为安全令牌之类,则是非常危险的,很容易被黑客猜测并利用。

  • ID设计阶段需要谨慎考虑暴露出的信息。例如,Erlang版本的flake实现基于MAC地址计算WorkerID,在安全敏感的领域往往是不可以这样使用的

  • 从理论上来说,类似Snowflake的方案由于时间数据位数的限制,存在与2038年问题相似的理论极限。虽然目前的系统设计考虑数十年后的问题还太早,但是理解这些可能的极限是有必要的,也许会成为面试的过程中的考察点

如果更加深入到时钟和分布式系统时序的问题,还有与分布式ID相关但又有所区别的问题,比如在分布式系统中,不同机器的时间很可能是不一致的,如何保证事件的有序性?Lamport在1978年的论文(Time, Clocks, and the Ording of Events in a Distributed System)中就有很深入的阐述,有兴趣的同学可以去查找相应的翻译和解读。

最后,再补充一些当前分布式领域的面试热点,例如:

分布式事务,包括其产生原因、业务背景、主流的解决方案等。

理解CAP、BASE等理论,懂得从最终一致性等角度来思考问题,理解Paxos、Raft等一致性算法。

理解典型的分布式锁实现,例如最常见的Redis分布式锁。

负载均衡等分布式领域的典型算法,至少要了解主要方案的原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1306655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

控制笔记本电脑性能,增强性能/控制发热---Thinkpad x280

1、引言 手上有一台收来办公的Thinkpad x280,但安装的联想管家却没有性能调节选项,导致电脑性能释放很不顺手。由于有室外办公需求,也就有续航需求,也是让它减少发热;同时我想在室内的时候,完整发挥它的性能&#xff…

Oracle md5

SQL CREATE OR REPLACE FUNCTION MD5(passwd IN VARCHAR2) RETURN VARCHAR2 ISretval varchar2(32); BEGINretval : utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING > passwd));RETURN retval; END; 测试 select md5(lw112190) from dual 效果

SAP ABAP excel文件模板上传下载

一:事物码smw0 二:上传步骤 程序源码: l_filename XX.xls.l_muban z123. *&---下载模板PERFORM frm_get_fullpath CHANGING gv_fullpath gv_path gv_name. *&---路径为空则退出IF gv_fullpath IS INITIAL.MESSAGE 用户取消操作 T…

【STM32F103】ADC 模拟数字转换器

ADC ADC(Analog-to-Digital Converter),模拟-数字转换器,也叫模数转换器,可以将连续变化的模拟信号转换为离散的数字信号。 我们可以外接上将采集信号转为模拟信号的模块,如光敏电阻传感器,热…

光学遥感显著目标检测初探笔记总结

目录 观看地址介绍什么是显著性目标检测根据不同的输入会有不同的变体(显著性目标检测家族)目前这个领域的挑战 技术方案论文1(2019)论文2(2021)论文3(2022) 未来展望 观看地址 b站链接 介绍 什么是显著性目标检测 一张图片里最吸引注意力的部分就是显著性物体,…

【大数据-Hadoop】从入门到源码编译-概念篇

【大数据-Hadoop】从入门到源码编译-概念篇 Hadoop与大数据生态(一)Hadoop是什么?(二)Hadoop组成1. HDFS1.1 NameNode(nn)1.2 DataNode(dn)1.3 Secondary NameNode&#…

公众号怎么提高2个限制

一般可以申请多少个公众号?许多用户在申请公众号时可能会遇到“公众号显示主体已达上限”的问题。这是因为在2018年11月16日对公众号申请数量进行了调整,具体调整如下:1、个人主体申请公众号数量上限从2个调整为1个。2、企业主体申请公众号数…

Docker - Android源码编译与烧写

创建源代码 并挂载到win目录 docker run -v /mnt/f/android8.0:/data/android8.0 -it --name android8.0 49a981f2b85f /bin/bash 使用 docker update 命令动态调整内存限制: 重新运行一个容器 docker run -m 512m my_container 修改运行中容器 显示运行中容器 d…

深入理解 Goroutines 和 Go Scheduler

本文将重点帮助您了解 Golang 中的 goroutines。Go 调度程序如何工作以在 Go 中实现最佳并发性能。我会尽力用简单的语言解释,这样你就可以理解了。 我们将介绍什么是操作系统中的线程和进程,什么是并发,为什么实现并发很难,以及 goroutines 如何帮助我们实现并发。然后,…

十八)Stable Diffusion使用教程:艺术二维码案例

今天说说怎么样使用SD生成艺术二维码。 我们直接上图。 方式有三种,分别如下: 1)方式一:直接 contronet 的tile模型进行控制 使用QRBTF Classic生成你的二维码。 首先输入网址,选择喜欢的二维码样式(推荐第一种就行): 然后选择相应参数,这里推荐最大的容错率,定…

IT圈茶余饭后的“鄙视链” C,C++,Java,Python

目录 C语言的自尊心 C语言的历史与地位 C语言的支持者心态 鄙视链的表现 自尊心的盲点 C的复杂之美 多范式编程的复杂性 高度的控制权 模板元编程的奇妙 面向对象的强大 Java的跨平台与舒适感 跨平台性的优势 舒适的开发体验 对其他语言的轻蔑 面向企业级应用的自…

不再兼容“安卓“,鸿蒙开发与android对比

首先,鸿蒙系统采用了分布式技术,其设计理念是“能用分布式解决的问题就不用单机解决”。这意味着鸿蒙旨在构建一个统一的分布式操作系统,可以支持不同设备之间的交互和通信。 而安卓系统基于Linux内核和Java编程语言构建,属于单机…

SqlServer中,数字-null的问题

一、业务描述 叫货单,已知叫货金额,填写本次付款金额,计算待付款金额 二、问题 在计算待付款金额时,偶尔会出现待付款金额为空的情况,百思不得其解 三、解决 仔细检查,发现了猫腻。 简单的说&#xff…

Axure元件的介绍使用以及登录界面

一、Axure元件介绍 简介: Axure元件是一种功能强大的设计工具,专门用于用户体验设计和交互设计。它可以帮助设计师创建可交互的原型,并实现各种界面元素的设计和布局。 Axure元件的基本特点包括: 多样性:Axure元件包括…

Unity检测AssetBundle是否循环依赖

原理:bundle的依赖关系构建一个二维的矩阵图,如果对角线相互依赖(用1标记)则表示循环依赖。 using PlasticGui; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public cl…

数字社会观察:TikTok如何影响青少年文化?

TikTok,这个全球短视频巨头,正在成为塑造青少年文化的引领者。在这个数字社会中,TikTok的崛起不仅改变了信息传递的方式,更深刻地影响着青少年的价值观、审美观和社交方式。本文将深入探讨TikTok如何在数字社会中塑造和影响青少年…

都是星光赶路人

不知不觉已经快工作五年了,工作以后就感觉时间一年比一年快,仿佛昨天才刚毕业,就像陈鸿宇歌中的那样,多少遗憾自负存念想,唯有时间不可挡。五年,思考了很多,也想明白了许多。正好借着年末&#…

可视化 Java 项目

有一定规模的 IT 公司,只要几年,必然存在大量的代码,比如腾讯,2019 年一年增加 12.9 亿行代码,现在只会更多。不管是对于公司,还是对于个人,怎么低成本的了解这些代码的对应业务,所提…

【设计模式--行为型--策略模式】

设计模式--行为型--策略模式 策略模式定义结构案例优缺点使用场景 策略模式 定义 该模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算…

【摸鱼向】利用Arduino实现自动化切屏

曾几何时,每次背着老妈打游戏的时候都要紧张兮兮地听着爸妈是不是会破门而入,这严重影响了游戏体验,因此,最近想到了用Arduino加上红外传感器来实现自动监测的功能,当有人靠近门口的时候,电脑可以自动执行预…