首页 › AI System Design › 第8章:设计URL缩短器

第8章:设计URL缩短器

简介​

本章将探讨类似 TinyURL 的 URL 短链服务的设计。该系统的主要目标包括URL 短链化, 重定向以及高可扩展性,以应对大规模的流量需求。​

Requirements​

•

缩短后的URL必须唯一且尽可能短.​

•

每天处理1亿个URL生成,并具备10年的支持能力。​

•

支持高效的读操作,读写比为10:1。​

•

存储3650亿条记录,10年所需存储空间约为365 TB。​

​

​

步骤1:概要设计​

API Endpoints​

URL缩短:​

◦

端点:POST api/v1/data/shorten​

◦

参数:{longUrl: longURLString}​

◦

返回值:shortURL​

URL重定向:​

◦

Endpoint: GET api/v1/shortUrl​

◦

Returns: longURL for redirection.​

​

飞书文档 - 图片

​

URL Redirection​

•

301 重定向:301 重定向表示请求的 URL 已“永久”移动到长 URL。浏览器会缓存该响应,后续对同一 URL 的请求将不再发送至 URL 短链服务。​

•

302 Redirect: Temporary; useful for analytics like tracking clicks.​

URL Shortening​

​

飞书文档 - 图片

​

•

使用哈希函数生成短网址,将长网址映射为唯一的缩短版本。​

•

哈希函数必须满足以下要求:​

◦

每个长网址都必须哈希为一个哈希值。​

◦

每个哈希值都可以映射回对应的长网址。​

​

​

步骤2:深入设计​

Data Model​

将<shortURL, longURL>存储在关系型数据库中,以优化内存使用。表结构包括:​

•

id(主键),​

•

shortURL,​

•

longURL.​

​

​

Hash Function​

基数62转换:​

•

使用字符对数字进行编码[0-9, a-z, A-Z], 提供62个可用字符.​

•

进制转换是URL缩短器中常用的另一种方法。​

•

可以为短链接分配一个唯一ID,然后将该ID进行62进制转换,从而得到短URL。​

•

一个7位字符的哈希值最多可支持3.5万亿个唯一URL,足以容纳3650亿个URL。​

示例:​

将ID2009215674938转换为Base 62:​

•

这是一个名为“system-design-notes/01. Scaling at main · liquidslr/system-design-notes”的GitHub仓库页面。上下文。​

哈希 + 冲突解决:​

•

使用CRC32、MD5或SHA-1等哈希函数。​

​

​

•

一种方法是取哈希值的前7个字符;然而,这种方法可能会导致哈希冲突。​

•

为了解决冲突,可以递归地追加一个新的预定义字符串,直到不再发生冲突,但这样做可能代价高昂。​

•

通过布隆过滤器解决冲突,实现高效查找。​

​

​

Comparison​

•

哈希 + 冲突解决:​

◦

短网址长度固定​

◦

无需唯一ID生成器​

◦

可能发生冲突,需进行解决​

•

采用Base62编码​

◦

长度不固定,随ID增长​

◦

需要唯一ID生成器​

◦

不可能发生冲突​

◦

如果ID按1递增,则很容易找到下一个短网址(可能存在安全风险)​

​

​

URL Shortening Flow​

​

​

检查是否longURL存在于数据库中。​

如果找到,则返回已有shortURL.​

否则:​

◦

使用分布式ID生成器生成一个唯一ID。​

◦

将ID转换为shortURL采用Base 62编码。​

◦

将<id, shortURL, longURL>映射存储在数据库中。​

​

​

URL Redirecting Flow​

​

​

用户点击一个shortURL.​

查询<shortURL, longURL>映射:​

◦

首先检查缓存以获得更快的访问速度。​

◦

如果不在缓存中,则查询数据库。​

将用户重定向至longURL.​

​

​

其他注意事项​

Rate Limiter​

•

通过为每个IP地址设置请求数量限制来防止滥用。​

Scalability​

Web层:无状态,可通过增减Web服务器实现扩展。​

数据库层:采用复制与分片技术。​

Analytics​

•

收集点击率、来源及时间戳等数据,以获取业务洞察。​

High Availability and Reliability​

•

通过数据库复制与容错设计,确保服务的一致性和可靠性。​