系统设计面试王牌分布式ID生成器
一、简介
当您将图像上传到Instagram或在您最喜欢的经纪应用程序上进行交易时,后端系统会为新创建的对象分配一个唯一ID(UID)。此ID通常用作某些数据库表中的主键,可用于高效地检索对象。我猜你知道我要去哪里我们如何生成UID?
嗯,你肯定知道SQL中的自增主键。依赖这个特性的问题很明显它只适用于单机数据库,因为它涉及锁定,因此不可扩展。如果我每秒需要数百万个UID用于Slack、AWS、Youtube等应用程序怎么办?在本文中,我想与大家分享我的大型UID生成器的设计。1。1要求
在生成UID时,必须区分两种类型的UID。首先是没有明显语义的随机UID。其次,有顺序UID,带有排序等固有信息。
图1。两种类型的UID,作者图
随机UID不会泄漏任何有意义的信息,因此将其提供给人类更安全(客户端和人类不同!客户端是代码,它会尝试猜测其他人的URL)。给定一个随机UID,很难猜测其他对象的ID,从而提供一些隐私。Youtube上的视频或TinyUrl上的链接都是以这种方式编码的。例如,如果我创建了一个tinyUrl并获得了tinyurl。com2p8u9m2d,我很难猜测其他新创建的URL(事实上,tinyurl。com2p8u9m3d或tinyurl。com2p8u9m2c并不存在)。
顺序UID有其自身的优点。它的内在含义帮助应用程序组织数据。例如,在Instagram的Slackimages中为聊天消息提供连续的UID是有意义的,因为我们想保留项目顺序。此外,如果UID不暴露给人类,即使不使用固有顺序,也可以使用顺序UID。
在本文中,我将重点关注顺序UID,因为大多数百万WPS级别的应用程序不会向人类提供UID。以下是系统的核心功能需求:能够每秒生成一千万个顺序UIDUID必须保留一定程度的排序信息能够根据消耗调整发电率
不用说,系统应该是可扩展的和高度可用的。2。高层设计
通常在系统设计面试中,我会从访问模式和数据库模式开始。但是,我们的系统不需要任何数据库支持,稍后我会向您展示。整个系统几乎是无状态的;如果一台发电机崩溃了,可以重新启动另一台发电机并重新开始。2。1API设计
我们的UID生成器只有一个目的为任何需要它们的人提供新的UID。因此,它只需要以下面向客户端的RPC接口:getuidbatch(batchsize:int)列表〔int64〕
为了最小化通信开销,客户端每约100毫秒获取一批UID,并将UID缓存在内存中。如果客户端崩溃,本地UID就会丢失,这很好,因为我们有很多东西可以浪费。2。2高层架构由于应用程序的任务是每秒生成数百万个UID,因此我们需要多台计算机同时工作才能满足需求。我们需要某种集群管理器来监控节点健康状况和工作负载。如果供不应求,经理将增加更多工人。
图2。架构,作者图2。3控制逻辑启动ZooKeeper服务和集群主管。在实践中,监督者可以被自动扩展容器的Kubernetes等软件的内置功能所取代。集群主管默认创建N个worker。当一个worker被创建时,它向ZooKeeper注册并获得一个唯一的workerID(简单的整数,例如,从0到256)。每个worker对应于ZooKeeper上的一个临时znode。当一个worker死亡时,它的znode将被删除,ZooKeeper会通知supervisor。所有工作人员定期将他们的CPU负载发送到集群管理器。经理删除添加工人以最好地满足消耗率。三、细节3。1UID分解
到目前为止,我们的讨论都集中在API和架构等高级功能上。在本节中,我们需要最终确定UID格式。应该多长时间?它捕获什么信息?
UID长度
UID长度由应用程序及其存储需求决定。我们假设外部服务每秒最多消耗1000万个UID。让我们检查耗尽不同长度的UID需要多长时间:
图3。UID耗尽日期,作者图
显然,我们至少需要56位,以便应用程序在其生命周期内永远不会用完新的UID。
UID时间戳
我们希望UID是可排序的,所以它的一部分必须是某种时间戳。对于我们的应用程序,将时间戳保持在毫秒粒度就足够了。一个好的起点是UNIX时间戳。但是,它有64位,对我们的应用程序来说太长了。为了解决这个问题,我们可以建立一个自定义纪元(而不是UNIX时间戳使用的纪元1970110:0:0)并计算经过的毫秒数。
图4。如何使用epoch,作者图
那么,应该用多少位来存储时间戳呢?图5显示了不同时间戳大小的溢出时间:
图5。不同时间戳大小的溢出时间,作者图
假设项目寿命为20年,我们使用40位是安全的。
UID附加信息
很想在这里停下来完成我们的UID设计。但是,无论时间戳多么精确,都无法防止UID冲突。两台计算机可能会生成两个具有相同时间戳的UID。为了区分同时生成的UID,我们必须投入新的信息。以下是我的建议,基于实践中使用的流行设计(TwitterSnowflake):
图6。UID分解,作者图WorkerID:我们可以使用分配给每台计算机的唯一WorkerID来区分。位数由集群中的最大工人数决定。线程ID:为了最大化吞吐量,多线程用于利用现代多核CPU机器提供的并行性。为什么不是进程ID?进程间通信更昂贵,我们希望将所有生成的ID放入一个共享的内存缓冲区中,以供RPC线程访问。本地计数器:即使在20年的老电脑上,一个线程也能在一毫秒内产生两个时间戳。因此,我们需要一个本地计数器来进一步区分两个UID。当计数器满时,线程在当前毫秒内进入休眠状态。
我在我的笔记本电脑上做了一个简单的实验,这是一台2019款六核MacBookpro。这是我实现的吞吐量(此处为代码):
图7。单机吞吐量,作者图
在不运行RPC服务器和其他繁重的东西的情况下,我的笔记本电脑可以达到每百万秒约40K个UID。理想沙箱中的吞吐量高得惊人,我认为性能只会在实践中下降。根据有根据的猜测,假设计算机可以生成5KUIDms。要达到1000万个UIDs,我们需要两台计算机。当然,在实践中,我们可能需要更多。
现在,将所有东西放在一起,峰值性能(对于我的笔记本电脑)是通过13个线程(4位)实现的,每个线程都有12位的本地计数器。不包括工人ID,我们的UID至少需要56位。因此,最好使用64位UID。
图8。UID细分,作者图3。2为什么不用队列
你们中的一些人可能想知道使用专用队列将外部服务与此ID生成系统分离是否是个好主意。一个可能的架构如下所示:
图9。具有队列接口的替代架构,由作者绘制
像Kafka这样的中间件服务提供了很好的特性,例如解耦、缓冲、重试和简单的接口。但是,此应用程序不需要这些功能。我们不需要缓冲多余的UID,因为它们可以被丢弃。该系统具有我能想象到的最简单的RPC接口,这使得Kafka的接口看起来像火箭科学。使用Kafka,消费者的数量受分区数量的限制,这很不方便。
在所有反对队列的理由中,这是让我相信RPC更好的最重要的理由。一些队列不会透露缓冲的消息数量,这使得我们的服务无法在需求上升下降时增加减少容量。使用RPC,集群主管可以更轻松地监控整体工作负载。如果没有人使用UID,一些工人将被解雇以节省资金。4。总结
在这篇文章中,我们设计了一个具有疯狂吞吐量的分布式顺序UID生成器。我们深入研究了各种方法之间的技术权衡。在面试中,没有最佳答案。所有解决方案都有优点和缺点;我们的工作是评估他们中的每一个,并根据面试官给出的限制做出最合理的权衡。
低成本副业卖手机壳项目思路,做的好轻轻松松年入10W!年轻人越来越喜欢捣鼓手机壳,不仅换壳频率越来越高,各种奇葩手机壳更是层出不穷,这也被商家盯上,变成了暴利生意,之前买壳是为脆弱的手机提供保护,通常只买一个,用坏了才换。但……
经典游戏仙剑1明明有钱就天下无敌,我费那个劲买金蚕王干嘛在《仙剑奇侠传1》中金钱是衡量一个玩家技术的关键,因为在这款游戏中只要你会管理银子,就能迅速走上人生巅峰,升不升级、买不买道具都无所谓的。这到底是为什么呢?这就不得……
升官,郭艾伦上任新职务,同曦美女老板夜访外援宿舍,汤杰又被裁过完春节,留给中国男篮小伙子的假期余额已经不足了,2月1日,他们也将再一次完成集结,这也是外教乔尔杰维奇上任后,中国男篮的第一次集训,也因为如此,这一支中国男篮队长职务的归属也……
OPPOReno9对比vivoS16手机对比Reno9【对比】S16【OPPOReno9】高频PWM调光、康宁大猩猩玻璃、更快的内存规格、更好的前置相机、红外遥控、更薄及更轻的机身、更低的官方售价……
寺库APP打不开咨询售后几年前,互联网商业平台迅速发展,趋势下竞争激烈,暴雷一个接一个,最近一个奢侈品平台疑似跑路上了热搜,没错就是我们熟悉的奢侈品电商第一股之称的寺库!去年开始寺库负面新闻不断……
夜读丨人生的意义,在于不断重塑自己绿标收听朗读音频文樱桃孔子说:君子不器。真正的君子,不会像器物那样,作用局限于某一方面。这是他在教导弟子们,做人不能狭隘,做事不可拘泥,不可故步自封。应放开眼……
2022上半年新能源物流车垄断和分散新能源专用车中体量最大的新能源物流车,在双碳战略的持续发力下,叠加国家及各地鼓励支持其发展的政策频出,2022年上半年仍克服了疫情肆虐、补贴退坡、材料涨价等一系列困难,交出了一……
狗尾巴草是个宝,用它来煮水喝,或能帮你解决这6个问题狗尾巴草是一种很常见的的植物,公路边的草地上、乡间小路的草丛里、农田的杂草中只要是有土的地方,都会看到狗尾巴草的身影。其实狗尾巴草也属于一种药材,在中医药领域中可以发挥清……
肚子疼就忍一忍?小心这些消化道疾病!肚子痛是我们生活中很常见的现象,比如吃了不干净的东西或者饮食过于辛辣刺激,都可能会导致肚子痛的现象发生。有的肚子痛比较轻微,能很快缓解,而有的肚子痛则比较严重,需要及时就医治疗……
励志诗词1、可上九天揽月,可下五洋捉鳖,谈笑凯歌还。世上无难事,只要肯登攀。2、大鹏一日同风起,扶摇直上九万里。3、咬定青山不放松,立根原在破岩中。4、粉身碎骨全不怕……
金价连跌4个月,有00后论斤买黄金!业内普通人配置黄金期货风本文来源:时代周报作者:周梦梅在避险需求推动下,今年年初,伦敦金(CFD)价格持续上涨,3月8日涨至2070。21美元盎司,逼近2020年8月的历史高位2074。71美元……
网红聂小雨穿旗袍现身国家乒乓球队,网友直呼毁三观随着短视频极速发展,一个名为网红的职业应势诞生。网红聂小雨便是凭借旗袍造型走红,她一条视频圈粉200多万,从此走上了人生巅峰。近日一条短视频在网上疯传,视频中网红聂……
马哲入驻快手,首播人气高涨,主播挑战赛值得期待提到自己的启蒙游戏,你会想到哪一款呢?相信很多玩家都会说是穿越火线。其实穿越火线这款游戏竞技性非常高,而且游戏技巧也非常多,对武器的要求也非常高,需要长年累月的不断练习才能成为……
沈阳下这么大的雪,街道上为什么看不到除雪车?今年的除雪确实没有往年的好,我分析原因有三点,仅代表个人意见,仅供参考。第一:雪下的比较突然,一开始是小冰粒,路面上结冰了,很多快速干道,桥上都堆积了事故车辆,连环追尾。……
陈露或被判10年以上?前男友回应信息量大,王萌评论区沦陷这一年注定不会平静,从年初到年底,人们看到了太多明星的丑态,很多明星都因为各种各样的原因退圈、被封杀,网友们都在问:娱乐圈还有希望吗?最近一段时间,王力宏对前妻不忠,出轨和招妓……
了解单味药紫河车的功效紫河车为人的胎盘。收集康产妇娩出的新胎盘,剪去脉带,洗净附着的血液,反复浸漂后,置沙锅内煮至漂浮水面,取出撑开烘千用,或用鲜品。性味、归经甘、咸,温。归心、肺……
德系美系国产车都在用双离合,为什么偏偏日系车不用双离合?因为双离合的核心技术都在欧美厂商手里,欧洲有LUK、格特拉克、ZF,美国有博格华纳。他们与双离合有关的核心部门都在德国。而日本,啥也没有。再者,双离合其实比同……
花费10亿元的广告宣传,也比不上这嚣张跋扈的态度头条创作挑战赛曹州牡丹园坐落于山东省菏泽市,国家4A级旅游景区,占地106万平方米,牡丹品种多达1237个,是目前世界上牡丹种植最多,也是最大的植物园林!每年的45……
聊聊2023年初的手机是什么样的!同质化有点严重2023春季第一波旗舰,从今年11月底陆续发布。外观:明年春季安卓这边的手机依然走一个辨识度路线,镜头处设计的趋势是做大做圆,背板纯色磨砂和多材质拼接。正面挖孔屏依然是主……
公交车司机的工资真的是2000吗?这个职业好干吗?工资不可能这么少,应该还要多些,后面加个零还差不多。这个职业很好干,但你干不来。看看货车司机的工资,就知道公交车司机的工资了。经常跑长途的货车司机一万五千起,一般的货车司……
广东有钱人很多,为什么感觉街上大都是20万左右的日系车?你这是什么理论,开好的车就代表有钱么,告诉你很多开宝马奔驰的还不如一个屌丝,至少屌丝不负债,真正有钱人一般很少开车,我认识的一个客户几个亿是有的,别人开的就是不到10万的车。〔……
大众车的车门为什么感觉厚实?不止是大众汽车,所有的德系车的车门都比较重。如果你驾驶过日系车就可以明显的对比出来,关门的声音以及感觉都不一样。使车门变重的因素有很多车门尺寸和厚度、外板和框架等材料的重……
日系车的安全性怎么样?实际上,日系到底安全不安全,这是个没有标准、一致答案的问题!有很多日系车碰撞破损严重受损的视频,但是德系也有美系也有,不同的碰撞场合、不同的碰撞条件,不同的重量、不同的速……
已经会开车的人去考驾照是一种什么体验?想起我考科三的时候,一个车的学员了。年纪有快40岁了,他是第一个考,我是最后一个,他全程稳如老狗,规定位置的点刹都让我毫无感觉,不像新手让你此起彼伏。掉头没有停车直接掉头了,当……