返回首页
Project

ShortURL 项目复盘:创建、重定向与系统权衡

短链接系统表面上只是把长 URL 转成短码,实际可以串联 ID 生成、幂等、缓存、并发、限流和消息可靠性,是一个很适合学习后端系统设计的项目。

创建短链接

一条典型创建链路是:

参数与 URL 校验
→ 计算长链接摘要并查询幂等记录
→ 从 ID 服务获取唯一 ID
→ Base62 编码为短码
→ 写入 MySQL
→ 更新布隆过滤器与缓存

“先查后插”并不能独自保证幂等。两个请求可能同时查到不存在,随后一起写入。最终仍需要数据库唯一索引兜底,失败的一方捕获冲突后重新查询已有记录。

重定向链路

重定向强调低延迟:

布隆过滤器
→ L1 Caffeine
→ L2 Redis
→ single-flight 合并并发回源
→ MySQL
→ 回填缓存
→ 返回 302

布隆过滤器用于快速排除一定不存在的短码,但存在假阳性;两级缓存降低 Redis 和数据库压力;single-flight 避免热点缓存失效时大量请求同时回源。

异步访问统计

跳转主链路不应同步等待统计写库。可以把访问事件写入 Redis Streams,由消费者异步聚合并更新数据库。这样提高了响应速度,也引入重复消费、Pending 恢复、ACK 时机和最终一致性问题。

不能回避的故障

  • Redis 故障:缓存、限流和统计分别如何降级?
  • ID 服务故障:是否有本地号段可继续使用?
  • MySQL 冲突:能否区分正常幂等竞争和真实异常?
  • 热点短码:单机 L1、分布式 L2 与数据库各承受多少压力?

这个项目最有价值的部分,不是组件数量,而是能够指出当前实现的限制,再用并发测试、真实依赖集成测试和压测验证改进。理解一个不完美系统,比包装一个“生产级”标签更能体现工程能力。