短链接服务架构是指网址缩短服务的内部设计和技术实现的整体蓝图。这也是系统设计面试中的经典题目,是学习可扩展 Web 服务设计原则的优秀案例。
基本架构由三个核心组件构成。第一是 URL 缩短引擎 (接收长 URL,生成唯一短码并存入数据库);第二是重定向引擎 (接收短链接访问请求,从数据库获取重定向目标并返回 301/302 响应);第三是分析引擎 (收集和汇总点击数据,提供统计信息)。
短码生成方式主要有三种:计数器方式 (将自增 ID 转换为 Base62 编码)、哈希方式 (取 URL 的 MD5/SHA256 哈希值的前 N 位)、随机生成方式 (生成随机字符串并检查冲突)。计数器方式实现最为简洁且不会产生冲突,常被作为设计的起点。但其短码依次排列,他人创建的短链接容易被机械式地逐个扫描。若处理的 URL 并不以公开为前提,通常会先对自增值做一次变换再对外呈现,或改用随机生成加冲突检查的方案。多台服务器共用一个计数器时,还需要确定在何处保证 ID 的唯一性。
可扩展性的关键在于缓存策略。短链接只需登记一次,之后每被打开一次就读取一次,因此重定向处理中读取操作远多于写入操作,Redis 或 Memcached 缓存非常有效。将经常被打开的短链接保存在缓存中,可以大幅减少数据库查询,缩短查得重定向目标所需的时间。不过用户实际感受到的等待时间还包含终端与服务器之间的往返通信,并非仅由缓存决定。
数据库设计方面,键值存储 (DynamoDB、Redis) 非常适合短链接的查找操作。以短码为键、原始 URL 及附属信息为值的简单结构即可满足需求。当读写量超出单台节点的承载能力时,可以考虑以短码为依据将数据分散到多个节点的分片方案。此时若仅按首字符划分,数据可能因短码生成方式而集中于特定节点,因此需要选择能使分布均匀的划分方式。