CHAPTER 8: 《DESIGN A URL SHORTENER》第8章 《设计一个url伸缩器》

news2024/9/22 9:53:17

CHAPTER 8: DESIGN A URL SHORTENER

在这一章中,我们将解决一个有趣而经典的系统设计面试问题:设计一个像tinyurl这样的网址缩短服务。

步骤1 -理解问题并确定设计范围

系统设计面试的问题是故意留下开放式的。精心设计系统中,提出澄清性问题是至关重要的。
候选人:你能举例说明网址缩短器是如何工作的吗?
采访者:假设URLhttps://www.systeminterview.com/q=chatsystem&c=loggedin&v=v3&l=long是原版URL。您的服务创建了一个较短长度的别名:https://tinyurl.com/ y7keocwj。如果你单击别名,它会将您重定向到原始URL。
候选人:交通流量是多少?
采访者:每天产生1亿个url。
候选人:缩短后的URL有多长?
采访者:越短越好。
候选人:缩短后的URL中允许使用哪些字符?
采访者:缩短的URL可以是数字(0-9)和字符(a- Z, a Z)的组合。
候选人:短网址可以删除或更新吗?
采访者:为了简单起见,让我们假设缩短的url不能被删除或更新

以下是基本用例:

  1. URL缩短:给定一个长URL =>返回一个更短的URL
  2. URL重定向:给定较短的URL =>重定向到原始URL
  3. 高可用性、可伸缩性和容错考虑

信封的背面估计

  • 写操作:每天生成1亿个url。
  • 每秒写操作数:1亿/ 24 /3600 = 1160
  • 读操作:假设读操作与写操作的比例为10:1,读操作每秒操作数:1160 * 10 = 11,600
  • 假设网址缩短服务将运行10年,这意味着我们必须支持1亿* 365 * 10 = 3650亿条记录。
  • 假设平均URL长度为100。
  • 10年以上存储需求:3650亿* 100字节* 10年= 365tb

对于你来说,和面试官讨论这些假设和计算是很重要的,这样你们可以达成一致。

步骤2 -提出高层次的设计并获得支持

在本节中,我们将讨论API端点、URL重定向和URL缩短流。

API端点

API端点促进了客户机和服务器之间的通信。我们将设计api restful。如果您不熟悉restful API,可以参考外部资料,例如参考资料[1]中的一个。URL缩短器主要需要两个API端点。

  1. 网址缩短。要创建一个新的短URL,客户机发送一个POST请求,其中包含
    一个参数:原始的长URL。API是这样的:
    POST api / v1 /data/shorten
    • 请求参数:{longUrl: longURLString}
    • 返回shortURL
  2. URL重定向。为了将短URL重定向到相应的长URL,客户端发送一个GET请求。API是这样的:
    GET api / v1 /shortUrl
    • 返回longURL用于HTTP重定向

URL重定向

如figure8-1所示,在浏览器中输入一个tinyurl。一旦服务器接收到一个tinyurl请求,它将短URL更改为301重定向的长URL。
在这里插入图片描述客户端和服务器之间的详细通信如figure8-2所示。
在这里插入图片描述
这里值得讨论的一件事是301重定向和302重定向。
301重定向。301重定向显示所请求的URL被“永久”移动到长URL。由于它是永久重定向的,因此浏览器会缓存响应,并且对同一URL的后续请求将不会发送到URL缩短服务。相反,请求被直接重定向到长URL服务器。
302重定向。302重定向意味着URL被“暂时”移动到长URL,这意味着对同一URL的后续请求将被发送到URL缩短服务第一。然后,它们被重定向到长URL服务器。

每种重定向方法都有其优缺点。如果优先考虑的是减少服务器负载,使用301重定向是有意义的,因为只有相同URL的第一个请求被发送到URL缩短服务器。然而,如果分析是重要的,302重定向是一个更好的选择更容易跟踪点击率和点击来源。

实现URL重定向最直观的方法是使用哈希表。假设哈希表存储<shortURL, longURL>对,URL重定向可以通过后:

  • GET longURL: longURL = hashTable.get(shortURL)
  • 获得长URL后,执行URL重定向。

网址缩短

让我们假设短URL是这样的:www.tinyurl.com/{hashValue}。为了支持URL缩短用例中,我们必须找到一个哈希函数fx,将长URL映射到hashValue,如figure8-3所示。
在这里插入图片描述
哈希函数必须满足以下要求:

  • 每个longURL必须散列到一个hashValue。
  • 每个hashValue都可以映射回longURL。

对哈希函数的详细设计进行了深入的讨论。

步骤3 -设计深度潜水

到目前为止,我们已经讨论了URL缩短和URL的高级设计重定向。在本节中,我们将深入探讨以下内容:数据模型、哈希函数、URL缩短和URL重定向。

数据模型

在高级设计中,所有内容都存储在散列表中。这是一个很好的起点;然而,由于内存资源有限,这种方法在实际系统中是不可行的和昂贵的。更好的选择是在关系中存储<shortURL, longURL>映射数据库。figure8-4展示了一个简单的数据库表设计。表的简化版本包含3列:id, shortURL, longURL。
在这里插入图片描述

哈希函数

哈希函数用于将长URL哈希为短URL,也称为hashValue

哈希值长度

hashValue由字符[0-9,a-z, a-z]组成,其中10 + 26 + 26 = 62可能的字符。要算出hashValue的长度,找到最小的n,使得62^n≥3650亿。系统必须支持最多3650亿个url信封的估计。hashValue的长度和对应的值如table8-1所示它可以支持的最大url数。
在这里插入图片描述
当n = 7,62 ^ n = ~3.5万亿时,3.5万亿足以容纳3650亿个url,所以hashValue的长度是7。
我们将探索URL缩短器的两种类型的哈希函数。第一个是“hash +”碰撞分辨率”,第二个是“62进制转换”。让我们逐一来看一下一个。

哈希+碰撞分辨率

为了缩短长URL,我们应该实现一个散列函数,将长URL散列到7-字符串。一个直接的解决方案是使用众所周知的哈希函数,比如CRC32,MD5或SHA-1。下表比较了应用不同哈希后的哈希结果此URL上的函数:https://en.wikipedia.org/wiki/Systems_design。
在这里插入图片描述
如table8-2所示,即使是最短的哈希值(来自CRC32)也太长(大于7)字符)。我们怎样才能缩短它?第一种方法是收集哈希值的前7个字符;然而,这种方法可能导致哈希冲突。为了解决哈希冲突,我们可以递归地附加一个new预定义的字符串,直到没有发现更多的冲突。figure8-5说明了这个过程
在这里插入图片描述这种方法可以消除碰撞;但是,查询数据库进行检查的成本很高如果每个请求都存在一个shortURL。一种叫做bloom filters的技术可以改进的性能。布隆过滤器是一种节省空间的概率技术,用于测试元素是否存在集合中的一员有关更多细节,请参阅参考资料[2]。

62进制转换

基转换是URL缩短器常用的另一种方法。基地转换帮助在不同的数字表示系统之间转换相同的数字。基地使用62转换,因为hashValue有62个可能的字符。让我们用解释转换如何工作的示例:将1115710转换为62进制表示(1115710在10进制中表示11157)。

  • 从它的名字可以看出,base 62是一种使用62个字符进行编码的方法。这些映射是:0 - 0,…, 9- 9,10 -a, 11-b,…, 35-z, 36-A,…, 61-Z,其中“a”代表10,“Z”代表61,等。
  • 1115710 = 2 × 622+ 55 × 621 + 59 × 620= [2, 55, 59] -> [2, T, X] in base 62
    表示。对话过程如figure8-6所示。
    在这里插入图片描述 因此,短URL是https://tinyurl.com /2TX

两种方法的比较

两种方法的区别如table8-3所示。

哈希+碰撞分辨率62进制转换
固定短URL长度短的URL长度不固定,他和ID一起上升
它不需要固定的ID生成器此选项依赖于唯一的ID生成器
碰撞是可能的,必须解决冲突是不可能的,因为ID是唯一的
不可能找出下一个可用的的短url,因为它不依赖于ID如果新条目ID增加1,则很容易找出下一个可用的短的URL,这可能是一个安全问题

网址缩短深度挖掘

作为系统的核心部分之一,我们希望URL缩短流是合乎逻辑的简单和功能。在我们的设计中使用了Base 62转换。我们构建了以下内容流程如figure8-7所示。
在这里插入图片描述

  1. longURL是输入。
  2. 系统检查longURL是否在数据库中。
  3. 如果是,则表示之前将长url转换为短url。在本例中,获取从数据库中获取shortURL并将其返回给客户端。
  4. 如果不是,则longURL是新的。一个新的唯一ID(主键)由唯一生成身份证生成器。
  5. 使用base 62转换将ID转换为shortURL。
  6. 用ID、shortURL和longURL创建一个新的数据库行

为了使流程更容易理解,让我们看一个具体的例子。

  • 假设输入的longURL为:https://en.wikipedia.org/wiki/Systems_design
  • 唯一ID生成器返回ID: 2009215674938。
  • 使用base 62转换ID为shortURL。ID为2009215674938转换为“zn9edcu”。
  • 将ID、shortURL和longURL保存到数据库中,table8-4所示
    在这里插入图片描述
    分布式唯一ID生成器值得一提。它的主要功能是生成全局唯一的id,用于创建短url。在高度分布的环境中,实现唯一ID生成器是具有挑战性的。幸运的是,我们已经做到了在“第7章:设计一个分布式的唯一ID生成器”中讨论了一些解决方案系统”。你可以回过头来复习一下。

URL重定向

URL重定向的详细设计如figure8-8所示。因为有更多的阅读写入,<shortURL, longURL>映射存储在缓存中,以提高性能。
在这里插入图片描述
URL重定向的流程总结如下:

  1. 用户单击URL短链接https://tinyurl.com/zn9edcu
  2. 负载均衡器将请求转发给web服务器。
  3. 如果短url已经在缓存中,则直接返回长url。
  4. 如果短url不在缓存中,则从数据库中获取长url。如果不是在数据库中,很可能是用户输入了无效的shortURL。
  5. longURL返回给用户。

步骤4 -打包

在本章中,我们讨论了API设计,数据模型,哈希函数,URL缩短,和URL重定向。
如果在面试结束时有额外的时间,这里有一些额外的谈话要点。

  • 速率限制器:我们可能面临的一个潜在安全问题是,恶意用户发送数据包大量的URL缩短请求。速率限制器有助于过滤基于IP地址或其他过滤规则的请求。如果你想回忆一下关于速率限制,请参见“第四章:设计速率限制器”。
  • Web服务器扩展:由于Web层是无状态的,所以很容易扩展Web层添加或删除web服务器。
  • 数据库扩展:数据库复制和分片是常用的技术。
  • 分析:数据对商业成功越来越重要。集成分析URL缩短器的解决方案可以帮助回答一些重要的问题,比如有多少人们点击链接?他们什么时候点击链接?等。
  • 可用性、一致性和可靠性。这些概念是任何大型游戏的核心系统的成功。我们在第一章已经详细讨论过了,请大家复习一下关于这些话题。
    恭喜你走了这么远!现在给自己点鼓励吧。好工作!

Reference materials 参考资料

[1] A RESTful Tutorial: https://www.restapitutorial.com/index.html
[2] Bloom filter: https://en.wikipedia.org/wiki/Bloom_filter

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

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

相关文章

HDCTF 2023 复盘

web yamiyami 当时考虑直接读的/proc/self/environ 读到flag是not_flag 就没考虑过/proc/1/environ了 然后不知道py3URL二次编码的特性,读不到源码,无从下手 做flask算pin码的题做多了,还以为pid是1的就是self,难顶 上面那种是非预期 预期是yaml反序列化 先读源码 /read?u…

产品推荐丨智慧水利行业应用终端+云平台

智慧水利是我国智慧城市建设的重要延伸&#xff0c;是新时代水利现代化的战略目标&#xff0c;贯穿于防汛抗旱减灾、水资源合理配置和高效利用、水资源和河湖健康保障等体系。随着水利技术的集成发展与场景的成熟应用&#xff0c;我国水利现已完成从自动化阶段到信息化阶段的过…

学习系统编程No.13【文件系统】

引言&#xff1a; 北京时间&#xff1a;2023/3/31/7:48&#xff0c;该篇博客在两天前本就应该产出&#xff0c;但是摆烂谁拦得住&#xff0c;所以呜呜呜&#xff01;本以为欠的钱也要快还完了&#xff0c;没想到啊&#xff0c;越欠越多&#xff0c;烦人&#xff01;但是&#…

领略未来无需远方,华为全屋智能将在AWE描绘智慧生活新图景

作者 | 曾响铃 文 | 响铃说 4月27日-30日&#xff0c;AWE 2023中国家电及消费电子博览会将在上海新国际博览中心举行&#xff0c;这是AWE展沉淀两年后的再次回归。 作为家电及消费电子领域TOP3的国际盛会&#xff0c;本届AWE以“智科技&#xff0c;创未来”为主题&#xff0…

Redis 数据存储原理

核心模块如图 1-10。 图1-10 图 1-10 Client 客户端&#xff0c;官方提供了 C 语言开发的客户端&#xff0c;可以发送命令&#xff0c;性能分析和测试等。 网络层事件驱动模型&#xff0c;基于 I/O 多路复用&#xff0c;封装了一个短小精悍的高性能 ae 库&#xff0c;全称是 …

如何写好学位论文

昨天刚提交了学位论文&#xff0c;今天准备来总结一下一些常用的Word写作技巧。 样式与多级列表 论文一般都会对章节条目的标题、参考文献、表格内容、题注的字体字号、行间距、段落间距等作出规定。为每一类文字设置一种样式&#xff0c;在写的时候直接应用样式可以方便地对全…

研报精选230421

目录 【行业230421南京证券】氢能行业&#xff1a;地缘政治加速绿色能源转型 【行业230421华安证券】AIGC行业研究框架与投资逻辑 【行业230421信达证券】工控行业深度报告&#xff1a;行业拐点将至&#xff0c;国产品牌加速崛起 【个股230421国信证券_华阳集团】聚焦汽车智能化…

ruoyi启动前端报错‘vue-cli-service‘ 不是内部或外部命令

解决方案&#xff1a; 在新项目的pack.json的文件目录&#xff0c;执行命令npm install 或者 cnpm install 如果报npm 不是内部命令&#xff0c;需要在系统配置全局的变量 在使用npm的时候&#xff0c;或者是通过npm下载了一些包&#xff0c;使用这些包的时候&#xff0c;有时…

LightGBM模型详解

1.背景 LightGBM 是微软开发的 boosting 集成模型&#xff0c;和 XGBoost 一样是对 GBDT 的优化和高效实现&#xff0c;原理有一些相似之处&#xff0c;但它很多方面比 XGBoost 有着更为优秀的表现。官方给出的这个工具库模型的优势如下&#xff1a; 更快的训练效率低内存使用…

全网最详细,web自动化测试窗口框架与验证码登录处理(超详细实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 selenium的作用域…

传输协议特点大比拼之TCP

文章目录 前言一.Tpc报头格式源端口和目的端口&#xff1a;序列号&#xff1a;确认号&#xff1a;数据偏移&#xff1a;控制位&#xff1a;窗口大小&#xff1a;校验和&#xff1a;紧急指针&#xff1a; 二.TPC原理2.1 确认应答机制2.2 超时重传机制2.3 连接管理机制2.3.1 三次…

档案室温湿度相关资料

国家档案局《档案库房技术管理暂行规定》对档案库房(也适用于机关档案室)温湿度要求做了如下明确界定&#xff1a;档案库房(含胶片室、磁带室)的温度应控制在14&#xff5e;24℃&#xff0c;有设备的库房日变化幅度不超过2℃&#xff0c;相对湿度应控制在45&#xff5e;60%&…

【大数据离线开发】9 Pig:数据分析引擎

文章目录 Pig&#xff1a;数据分析引擎9.1 什么是Pig9.1.1 简介9.1.2 与 Hive 的对比 9.2 Pig的体系结构和数据模型9.3 Pig的安装和工作模式9.3.1 Pig安装9.3.2 Pig工作模式 9.4 Pig的内置函数9.5 使用PigLatin语句分析数据9.6 Pig的自定义函数9.6.1 自定义过滤和运算函数9.6.2…

低资源环境下对风湿性心脏病的综合预测

文章目录 Ensembled Prediction of Rheumatic Heart Disease from Ungated Doppler Echocardiography Acquired in Low-Resource Settings摘要方法Echocardiogram Homogenization风湿性心脏病的检测 Ensembled Prediction of Rheumatic Heart Disease from Ungated Doppler Ech…

17、Logos使用摘要

本篇将讲述如何将WX的设置界面添加两个自定义的UI行: 包含是否启用某功能的开关,以及手速设置.并且如何定位到修改的代码.采用的是砸过壳的包. 成品也就是增加了两个UI及开关联动效果、 界面分析 如果我们要破解别人的App, 首先从界面UI入手,定位UI 1、使用class-dump导出全部…

分子共价对接(Covalent Docking)

共价对接&#xff08;Covalent Docking&#xff09; 随着人们对共价抑制剂的发现越来越重视&#xff0c;越来越多的软件开始支持共价抑制的虚拟筛选。常用的共价对接软件有CovDock&#xff0c;AutoDock4&#xff0c;FITTED&#xff0c;GOLD&#xff0c;ICM-Pro与MOE等。共价抑制…

断网了,还能ping通 127.0.0.1 吗?为什么?

你女神爱不爱你&#xff0c;你问她&#xff0c;她可能不会告诉你。 但网通不通&#xff0c;你 ping 一下就知道了。 可能看到标题&#xff0c;你就知道答案了&#xff0c;但是你了解背后的原因吗&#xff1f;那如果把 127.0.0.1 换成 0.0.0.0 或 localhost 会怎么样呢&#x…

易基因:ChIP-seq等揭示热休克转录因子A1b调控植物高温胁迫响应的分子机制|应激反应

在拟南芥中&#xff0c;热休克转录因子A1b&#xff08;HEAT SHOCK TRANSCRIPTION FACTORA1b&#xff0c;HSFA1b&#xff09;通过影响种子产量来调控对环境胁迫的抗性。HSFA1b是生殖适应性的决定性因素&#xff0c;这种调控机制怎么形成的呢&#xff1f; 2018年&#xff0c;英国…

基于静态分析结果的测试用例自动生成方法

自动生成用例的方法有多种&#xff0c;主要包括随机法、遗传算法、等价类划分法、约束求解法等。各种方法的适用范围、性能及生成的用例质量各不相同&#xff0c;具体见表1。从表1可以看出&#xff0c;约束求解法效率高&#xff0c;生成的用例质量也高&#xff0c;所以本项目中…

RabbitMQ-Topic(主题模式)

Topic topics 模式支持模糊匹配RoutingKey&#xff0c;就像是sql中的 like子句模糊查询&#xff0c;而路由模式等同于sql中的where子句等值查询 topic 交换机背后的路由算法类似于 direct 交换&#xff0c;使用特定路由键发送的消息将被传递到使用匹配绑定键绑定的所有队列。…