短链服务是系统设计面试的老题,但它把“读多写多极端不对称”这个问题浓缩得特别好。从零推演一遍。
核心问题:短码从哪来
三种方案:
- 自增 ID + Base62:简单,但暴露业务量,且单点发号。
- Hash + 冲突重试:无中心化发号,但要处理碰撞。
- 分段发号器:DB 按段批量发 ID,实例本地用完再取——多数生产系统的选择。
跳转:301 还是 302
用 301,浏览器会永久缓存跳转,短链服务就再也看不到这次访问——统计数据全丢。所以短链跳转一律 302,用服务端缓存扛住读流量。
写入路径:长链 -> 发号器 -> Base62 -> 落库 + 写缓存
读取路径:短码 -> 缓存(命中 99%) -> 302 -> 异步记点击
防刷与治理
- 恶意刷量:按 IP + UA 做滑动窗口限流;
- 合规:跳转前过一遍域名黑名单;
- 过期:短码配合 TTL 回收,热点数据自然沉淀。
这个系统没有一处用到高深技术,但每个决策背后都是一次取舍——这大概就是系统设计本身的样子。