URL缩短服务:复杂问题的简洁解决方案项目简介:TinyURL是一项在线服务,允许用户将长网址缩短为简洁的短网址,以便于

现在让我们设计一个像TinyURL一样的URL缩短服务。这个服务将提供短别名来重定向到长URL。

系统难度级别:初级

URL缩短用于为长URL创建更短的别名。我们将这些缩短后的别名称为“短链接”。当用户点击这些短链接时,他们会被重定向到原始URL。短链接在显示、打印、发送信息或发推文时节省了大量空间。此外,用户输入错误的可能性也会随着URL的缩短而减少。

例如,如果我们通过TinyURL缩短以下URL:

你应该在面试开始时就明确需求。务必提问,以找出面试官心中系统的准确范围。

我们的URL缩短系统应满足以下要求:

功能性需求:

非功能性需求:

扩展需求:

我们的系统将是读取密集型的。与新的URL缩短相比,将会有大量的重定向请求。我们假设读取和写入的比例是100:1。

流量估计:假设我们每月将有5亿次新的URL缩短,以100:1的读/写比率,我们可以预期在同一时期内有500亿次重定向:

我们系统的每秒查询数(QPS)是多少?每秒新的URL缩短数量:

考虑到100:1的读/写比率,每秒的URL重定向数量将是:

存储估计:我们假设存储每个URL缩短请求(及关联的缩短链接)5年。由于我们预计每月会有5亿个新的URL,因此我们预计存储的对象总数将是300亿个:

我们假设每个存储的对象大约为500字节(这只是一个大致的估计——我们稍后会深入研究)。我们需要15TB的总存储:

带宽估计:对于写请求,由于我们预计每秒会有200个新的URL,我们的服务总入站数据将是每秒100KB:

对于读请求,由于我们预计每秒将有大约20K个URL重定向,我们的服务总出站数据将是每秒10MB:

由于我们每秒有20K个请求,我们每天将获得17亿个请求:

为了缓存这20%的请求,我们需要170GB的内存。

这里需要注意的一点是,由于会有许多重复请求(相同的URL),我们实际的内存使用量将少于170GB。

高层次估计:假设每月有5亿个新的URL,并且读写比率为100:1,以下是我们服务的高层次估计的概述:

一旦我们确定了需求,接下来需要定义系统API。需要明确说明系统的预期功能。

我们可以使用SOAP或RESTAPI来公开我们服务的功能。创建和删除URL的API定义可能如下:

createURL(api_dev_key,original_url,custom_alias=None,user_name=None,expire_date=None)参数:

返回:(字符串)

成功插入返回缩短后的URL;否则,返回一个错误码。

deleteURL(api_dev_key,url_key)其中url_key是表示要检索的缩短URL的字符串;成功删除后返回URLRemoved。

在早期系统设计阶段定义DB模式对理解数据在各个组件之间的流动非常有帮助,随后会引导我们进行数据分区。

我们将存储的数据具有以下特点:

数据库架构:

我们需要两个表:一个用于存储URL映射信息,另一个用于存储创建短链接的用户的数据。

我们应该使用什么类型的数据库?由于我们预计将存储数十亿行,而且我们不需要使用对象之间的关系—一个NoSQL存储,如DynamoDB,Cassandra或Riak会是一个更好的选择。一个NoSQL选择也将更容易扩展。

我们这里要解决的问题是如何为给定的URL生成一个短而唯一的键。

A.编码实际的URL

我们可以计算给定URL的唯一哈希值(例如D5或SHA256等)。然后,哈希可以进行编码以便显示。这种编码可以是Base36([a-z,0-9])或Base62([A-Z,a-z,0-9]),如果我们添加'+'和'/',我们可以使用Base64编码。一个合理的问题是,短键的长度应该是多少?6、8还是10个字符?

假设对于我们的系统来说,有687亿个唯一字符串的六个字符键就足够了。

如果我们使用MD5算法作为我们的哈希函数,它将产生一个128位的哈希值。经过Base64编码后,我们会得到一个超过21个字符的字符串(因为每个Base64字符编码了哈希值的6位)。现在我们每个短键只有6(或8)个字符的空间;那么我们怎么选择我们的键呢?我们可以取前6(或8)个字符作为键。这可能会导致键重复;为了解决这个问题,我们可以从编码字符串中选择一些其他字符或交换一些字符。

我们的解决方案有哪些问题?我们的编码方案有以下几个问题:

解决问题的方法:我们可以在每个输入URL后附加一个递增的序列号使其唯一,然后生成哈希。然而,我们不需要在数据库中存储这个序列号。这种方法可能的问题可能是一个不断增加的序列号。它会溢出吗?附加一个递增的序列号也将影响服务的性能。

B.离线生成键

我们可以设立一个独立的键生成服务(KGS),预先生成随机的六位字符串,并将其存储在数据库中(我们称之为key-DB)。每当我们想要缩短一个URL,我们就会拿一个已经生成的键来使用。这种方式非常简单和快速。我们不仅不需要编码URL,而且不必担心重复或冲突。KGS会确保插入key-DB的所有键都是唯一的。

并发会引起问题吗?一旦一个键被使用,就应该在数据库中标记,以确保它不再被使用。如果有多个服务器同时读取键,我们可能会遇到两个或更多的服务器试图从数据库中读取同一个键的情况。我们如何解决这个并发问题?

服务器可以使用KGS在数据库中读取/标记键。KGS可以使用两个表来存储键:一个用于尚未使用的键,另一个用于所有已使用的键。一旦KGS将键提供给其中一个服务器,就可以将它们移动到已使用的键表中。KGS可以始终在内存中保留一些键,以便在服务器需要时快速提供。

为了简单起见,一旦KGS在内存中加载了一些键,就可以将它们移动到已使用的键表中。这确保每个服务器得到的键都是唯一的。如果KGS在将所有加载的键分配给某个服务器之前死机,我们将会浪费这些键——鉴于我们拥有的键的数量庞大,这可能是可以接受的。

KGS还必须确保不给多个服务器相同的键。为此,它必须在从中移除键并将它们提供给服务器之前,对保存键的数据结构进行同步(或对其加锁)。

key-DB的大小会是多少?**使用base64编码,我们可以生成687亿个唯一的六位键。如果我们需要一个字节来存储一个字母数字字符,我们可以将所有这些键存储在:

KGS会出现单点故障吗?会的。为了解决这个问题,我们可以设置一个备用的KGS副本。当主服务器出现故障时,备用服务器可以接管,生成并提供键。

每个应用服务器可以从key-DB中缓存一些键吗?是的,这肯定可以加快速度。然而,在这种情况下,如果应用服务器在消耗完所有键之前出现故障,我们将最终失去这些键。鉴于我们有687亿个唯一的六位键,这是可以接受的。

我们如何执行键查找?我们可以在数据库中查找键以获取完整的URL。如果它存在于数据库中,就向浏览器返回HTTP302Redirect状态,并在请求的Location字段中传递存储的URL。如果我们的系统中没有该键,则返回HTTP404NotFound状态或将用户重定向回主页。

我们应该对自定义别名设定大小限制吗?我们的服务支持自定义别名。用户可以自由选择他们喜欢的key,但提供自定义别名并不是必须的。然而,为了确保我们有一个一致的URL数据库,设定一个自定义别名的大小限制是合理的(甚至是用户期望的)。我们假设用户可以为每个自定义键指定最多16个字符(如上述数据库模式所示)。

为了扩展我们的数据库,我们需要对其进行分区,以便它能存储数十亿个URL的信息。因此,我们需要设计一个分区方案,将我们的数据划分并存储到不同的数据库中。

A.基于范围的分区:我们可以根据哈希键的第一个字母在不同的分区中存储URL。因此,我们将所有以字母“A”(和“a”)开头的URL哈希键存储在一个分区中,将以字母“B”开头的URL存储在另一个分区中,以此类推。这种方法被称为基于范围的分区。我们甚至可以将某些出现频率较低的字母组合到一个数据库分区中。因此,我们应开发一个静态分区方案,始终以可预测的方式存储/查找URL。

这种方法的主要问题是可能导致数据库服务器不平衡。例如,我们决定将所有以字母“E”开头的URL放入一个数据库分区,但后来我们发现以字母“E”开头的URL过多。

B.基于哈希的分区:在这种方案中,我们对存储的对象进行哈希。然后,我们根据哈希值计算使用哪个分区。在我们的情况下,我们可以获取key或短链接的哈希值,以确定我们存储数据对象的分区。

我们的哈希函数将随机地将URL分配到不同的分区(例如,我们的哈希函数可以始终将任何key映射到[1...256]之间的一个数字)。这个数字将表示我们存储对象的分区。

这种方法仍然可能导致分区负载过大,这可以通过使用'一致性哈希'来解决。

我们可以缓存频繁访问的URL。我们可以使用任何现成的解决方案,比如Memcached,它可以存储完整的URL及其对应的哈希值。因此,应用服务器在访问后端存储之前,可以快速检查缓存是否有所需的URL。

为了进一步提高效率,我们可以复制我们的缓存服务器来分配它们之间的负载。

每个缓存副本如何更新?每当有一个缓存未命中,我们的服务器会访问后端数据库。当这种情况发生,我们可以更新缓存,并将新的条目传递给所有的缓存副本。每个副本都可以通过添加新的条目来更新其缓存。如果副本已经有了该条目,它可以简单地忽略它。

我们可以在系统中的三个位置添加负载均衡层:

最初,我们可以使用一个简单的轮询方法,将进入的请求均等地分配到后端服务器。这种负载均衡方法简单易行,不会引入任何额外的开销。这种方法的另一个优点是,如果一个服务器死机,负载均衡器会将其从轮询中移除,停止向其发送任何流量。

轮询负载均衡的一个问题是,我们没有考虑到服务器的负载。如果一个服务器过载或运行缓慢,负载均衡器不会停止向该服务器发送新的请求。为了处理这个问题,我们可以放置一个更优的负载均衡解决方案,它定期查询后端服务器的负载,并根据负载情况调整流量。

我们如何统计短链接被使用的次数、用户的位置等信息?我们如何储存这些统计信息?如果它是数据库中的一部分,每次查看都需要更新,那么当一个流行的短链接被大量并发请求瞬间涌入时,会发生什么?

用户能否创建私有URL或者允许特定的用户组访问某个URL?

我们可以在数据库中每个URL的条目里存储访问权限级别(公开/私有)。我们也可以创建一个单独的表来存储有权访问特定URL的用户的UserID。如果一个用户没有权限但试图访问一个URL,我们可以返回一个错误(HTTP401)。考虑到我们的数据储存在一个类似Cassandra的NoSQL宽列数据库中,储存权限的表的key将是‘哈希值’(或KGS生成的key)。列将储存有权查看URL的用户的UserID。

THE END
1.常见智能算法和示例智能控制算法示例应用示例:数据挖掘、图像分割、客户细分等。 自组织映射(Self-Organizing Maps, SOM): 应用示例:数据可视化、模式识别、特征提取等。 这些算法在各自的应用领域都有广泛的成功案例,它们能够处理非线性、多模态和高维度的优化问题,且往往能发现全局最优解或接近最优解的解决方案。https://blog.csdn.net/liuzk423/article/details/139154708
2.算法平台架构设计方案mob649e81684ddc的技术博客随着数据驱动的决策日益变得重要,算法平台的需求也逐渐攀升。一个高效的算法平台不仅可以提高数据处理能力,还可以支持多种算法模型的开发与部署。本文将介绍一种算法平台架构设计方案,并结合代码示例和可视化工具,以便更好地理解其结构与功能。 一、算法平台架构概述 https://blog.51cto.com/u_16175515/12574038
3.建站哪个平台好/微信小程序开发文档建站哪个平台好,微信小程序开发文档,外贸网站建设外,买网站域名尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun 转自:http://blog.csdn.net/zddblog/article/details/7521424 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越。 1、SIFT综… http://www.jmfq.cn/news/21313.html
4.优化方案(实用)为了确保事情或工作有序有效开展,时常需要预先制定方案,方案属于计划类文书的一种。方案应该怎么制定才好呢?以下是小编为大家收集的优化方案10篇,欢迎大家分享。 优化方案 篇1 【摘要】变电站建设土建工程设计方案,对于整体工程的后续施工规划来说是至关重要的依据。本文针对变电站的土建设计的几个方面进行了总结,并https://www.oh100.com/a/202402/7633909.html
5.SIGIR2022多嘲多任务优化在支付宝数字金融搜索的应用三、算法方案设计 挑战:各场景存在较大的差异 我们可以将基金场景抽象成如下树状结构,分别是场景层,卡片层和任务层。 场景层主要是人群间差异。垂搜流量和成交明显比主搜更大,专业用户更多,但交集用户较少。 卡片层主要存在 Query 差异性,其原因是搜索 query 触发逻辑的不同,搜 "基金","股票型基金" 等泛品类https://cloud.tencent.com/developer/article/2050720
6.码垛机器人轨迹规划方法工业机器人本文提出的逼近算法以一种基于矢量合成的方法来实现逼近B点但不经过B点,这样就可以实现从A点经过B点附近再到C点整段路径的线速度只有在起点A和末点C为0,中间段不为0,最终提高整段的工作效率。 本方案的优势在于: (1)不需要额外增加物理部件,只需设计软件算法即可取得效果。 https://www.imrobotic.com/news/detail/5283
7.2020届计算机科学方向毕业设计(论文)阶段性汇报每次推荐系统提供的一批内容中广告的数量除了影响当前的用户反馈外,也会对用户的长期行为及推荐系统的长期优化目标产生影响。本次阶段性汇报主要介绍对推荐与广告合并的问题设定及基于强化学习的初步算法设计方案。 孙雪晖 有界树高SAT问题第一次阶段性汇报 将树高(tree-depth)的上界转化为路径宽度(path-width)的上界,https://zhiyuan.sjtu.edu.cn/html/zhiyuan/announcement_view.php?id=3709
8.算法决策:人工智能驱动的公共决策及其风险*在方案设计和制定环节,政策制定者需要借助各种倡议活动,利用专家知识、技术工具,特别是信息收集和处理技术使得方案具备合法性和满足绩效条件。整个政策方案的设计和选择过程都是建立在信息处理的基础上,人工智能算法凭借其信息处理和预测分析能力,在政策方案设计和制定环节中发挥着显著的作用。首先,人工智能可以推动对备选方https://www.opentimes.cn/html/Abstract/20842.html
9.《基于模型的故障诊断技术:设计方案算法和工具》简介当当悦读图书专营店在线销售正版《基于模型的故障诊断技术:设计方案、算法和工具》。最新《基于模型的故障诊断技术:设计方案、算法和工具》简介、书评、试读、价格、图片等相关信息,尽在DangDang.com,网购《基于模型的故障诊断技术:设计方案、算法和工具》,就上当当悦http://product.dangdang.com/11858349644.html
10.推荐系统架构设计与实现:从算法选择到工程化部署的解决方案通过上述算法选择、数据处理、性能优化和工程化部署的步骤,我们可以设计出一个高效、稳定、可维护的推荐系统架构。不同的业务场景和需求会有所不同,需要根据实际情况选择合适的技术方案和架构设计。希望本文能帮助大家更好地理解推荐系统的架构设计与实现过程。https://www.jianshu.com/p/5fb6a37a0153
11.基于教学目标分类法的算法设计与分析课程思政教学方案设计课程思政是新时代背景下提高思想政治教育实效性的积极探索[ 7 ],算法设计与分析课程顺应时代发展的要求,在课程教学中引入思政元素,合理使用多种线下线上教学手段,课程的教学实施方案和教学效果评价设计立足于教学目标分类法,建立知识传授、能力建设和情感(态度)养成分层递进的多维结构,提升了课程知识体系的教学效果和课程https://www.fx361.com/page/2022/0218/10045526.shtml
12.适用于MEMS传感器的软件解决方案,采用图形化无代码算法设计适用于MEMS传感器的软件解决方案,采用图形化无代码算法设计,支持开发嵌入式AI功能 获取软件 产品概述 描述 MEMS-Studio是一套完整的桌面软件解决方案,专为开发嵌入式AI功能、评估嵌入式库、分析数据,以及为整个MEMS传感器产品组合设计无代码算法而设计。这款独特的软件解决方案提供了多功能的开发环境,支持评估和编程所有MEhttps://www.st.com/zh/development-tools/mems-studio.html
13.HORIBA实时红外气体分析技术助力提升安全性可持续性和生产力“HORIBA的宗旨是走在行业前列。因此,在开发IRLAM实时气体分析技术时,我们知道我们需要一个能够贡献深刻技术见解的合作伙伴,同时也有能力为实时测量需求设计解决方案。ADI公司满足了所有这些需求。他们是真正的解决方案提供商,而不是单一的芯片制造商!” Kyoji Shibuya博士 https://www.analog.com/cn/signals/articles/horiba-customer-story.html
14.医疗行业超融合架构解决方案——架构方案设计篇s6dong2.1 设计概要 综合以上需求分析篇,结合目前医疗行业数据中心的演进方法论及最佳实践,建议采用分步分批的建设方式,使用扩展能力强,功能丰富的超融合基础架构方案,来满足医院业务系统高可靠性、高可用性、业务连续性、数据安全、数据备份、数据及应用容灾的需求。 https://redhat.talkwithtrend.com/Article/244291
15.科学网—[转载]基于容器云技术的典型遥感智能解译算法集成2 遥感智能解译算法集成方案设计 2.1 集成方案整体架构 随着计算机技术的发展,不同遥感解译处理算法、不同图像处理流程可以在统一的计算平台上集成与管理,不同遥感数据格式也可以相互集成与转换。为了应对多源、多算法的需求,集成方案的系统结构需要清晰且具有一定的开放性,用户可以用简单的方式添加新的功能处理模块,使集https://blog.sciencenet.cn/blog-3472670-1339282.html
16.「三维可视化」机器人人机界面的三维可视化设计方案「三维可视化」机器人人机界面的三维可视化设计方案,为了更好地提升 机器人人机界面的三维可视化实际操作特性,明确提出一种根据GPU即时图型追踪3D渲染的机器人人机界面的三维可视化重构设计方法。选用人工智能算法方式开展机器人的人机界面视觉效果特点取样,对取样的视觉效果清晰度信息开展稀少散点重构,在重构的三维空间中根据https://www.dtstack.com/news/7727
17.需求与痛点的区别以及如何引领产品设计新方向2. 需求和痛点的解决方案设计 1)推荐算法优化 Spotify通过优化推荐算法,为用户提供个性化的推荐列表。它运用机器学习和大数据技术,分析用户的听音乐历史和喜好,生成“每日发现”和“发现周报”的个性化推荐。 搜索功能优化: Spotify优化了搜索功能,通过增加多种筛选条件和相关搜索提示,帮助用户更快地找到想要的音乐和播客https://view.inews.qq.com/k/20231008A03SIJ00?no-redirect=1&web_channel=wap&openApp=false