系统设计之路:如何设计一个URL短链服务

每当我们学习一门新的编程语言,做的第一件事情,就是写一个 “ Hello world ” 程序,先让它能 Run 起来,潘多拉魔盒打开之后,再深入学习语言的其他精髓。

同样,我们在准备系统设计相关的面试时,“设计一个 URL 短链服务” 往往就是那个 “ Hello world ”。吃下这道开胃菜,才能有胃口品尝后续更美味的 “系统设计” 大餐,比如:

  • 设计 News Feeds 系统
  • 设计 Twitter
  • 设计搜索框中的下拉提示
  • 设计 12306 订票系统
  • 设计一个 KV 存储系统
  • 设计一个图书推荐系统
  • 等等

闲话少叙,下面我们一起先尝尝这道 “开胃菜”。

1. 什么是 URL 短链

URL 短链,就是把原来较长的网址,转换成比较短的网址。我们可以在短信和微博里可以经常看到短链的身影。如下图,我随便找了某一天躺在我短信收件箱里的短信。

系统设计之路:如何设计一个URL短链服务_第1张图片

上图所示短信中, https://j.mp/38Zx5XC ,就是一条短链。 用户点击蓝色的短链,就可以在浏览器中看到它对应的原网址:

那么为什么要做这样的转换呢?来看看短链带来的好处:

  • 在微博, Twitter 这些限制字数的应用中,短链带来的好处不言而喻: 网址短、美观、便于发布、传播,可以写更多有意义的文字;
  • 在短信中,如果含长网址的短信内容超过 70 字,就会被拆成两条发送,而用短链则可能一条短信就搞定,如果短信量大也可以省下不少钱;
  • 我们平常看到的二维码,本质上也是一串 URL ,如果是长链,对应的二维码会密密麻麻,扫码的时候机器很难识别,而短链则不存在这个问题;
  • 出于安全考虑,不想让有意图的人看到原始网址。

当然,以上好处也只是相对的,这不,随着微信扫码能力的提升,微信已经开始取消短链服务了。

系统设计之路:如何设计一个URL短链服务_第2张图片

2. 短链跳转主要原理

1. 客户端(或浏览器)请求短链: https://j.mp/38Zx5XC

2. 短链服务器收到请求后,返回 status code: 301 或 302 ,说明需要跳转,同时也通过 location 字段告知客户端:你要访问的其实是下面这个长网址 :
https://activity.icoolread.com/act7/212/duanxin/index

3. 客户端收到短链服务器的应答后,再去访问长网址:
https://activity.icoolread.com/act7/212/duanxin/index

系统设计之路:如何设计一个URL短链服务_第3张图片

实际浏览器中的网络请求如下图:

系统设计之路:如何设计一个URL短链服务_第4张图片

3. URL 短链设计的需求

功能性需求:

  • 给定原始的长 URL ,短链服务能生成比它短且唯一的 URL
  • 用户点击短 URL , 能跳转到长原始的长 URL
  • 短 URL 经过一定时间后,会过期
  • 接口需要设计成 REST API

非功能性需求:

  • 高可用:服务不能存在单点故障
  • 高性能:生成短 URL 的过程,以及从短 URL 跳转到原始 URL 要近实时
  • 安全:短链不可被预测,否则简单的遍历就能把所有短链都遍历完,空耗系统资源

4. 系统容量预估

我们知道,做系统架构的时候,应该要让系统能扛住两方面的 “压力”:写请求的压力和读请求的压力。写请求是指将长 URL 转换成短 URL ,并将短 URL 存到数据库。而读请求是指用户点击短 URL ,系统接到请求,从数据库中找到对应的长 URL ,返回给用户。

对于一个 URL ,通常情况下我们把它一次性转换好后,把它存到数据库就完事了(“写”)。接下来运营就会通过诸如短信、社交媒体等渠道将含有短链的内容发送给不同的用户,然后对内容感兴趣的用户会去点击该短链,继而跳转到目标页面(“读”)。这个系统的读请求要远高于写请求,是一个 “ Read-Heavy ” 的系统。这里,我们假设读写比是 100 : 1 。

假设,我们的系统 1 个月需要处理 30 M ( 3000 万) 的写请求(长链生成短链服务),那么按照 100 : 1 的读写比例,我们每个月需要处理 URL 跳转的次数为:

100 * 30 M = 3B ( 30 亿 

进而,我们可以估算出每秒需要处理的请求数( Q P S ):

每秒的写请求(长链生成短链):

30 M / ( 30 days * 24 hours * 60 min * 60 sec ) ≅ 12 requests/second

每秒的读请求(短链跳转长链):

100 * 1 2 r e ques t s / second = 1200 r e ques t s / second

接下来再估算一下需多少的存储空间。

假设我们会默认保存 5 年内的短链转换记录,那么 5 年内产生的 URL 数量:

3 0 M * 12 * 5 = 1,800,000,000

那么短链应该设计成多长,才能表示这 5 年内的这 18 亿的 URL 呢?

通常短链是用 [ 0-9 ], [ a-z ], [ A-Z ] 这 62 个字符的组合来表示的,那么长度是 N 的短链可以映射的 URL 数量如下图:

N

可映射的 URL 数量

1

62^1 = 62

你可能感兴趣的:(Java,spring,boot,spring,java,linux,运维)