亿级流量短链接平台架构设计笔记。

核心业务流

短链接平台的核心业务分为两个阶段:生成跳转

生成链路

用户提交原始长 URL,系统返回一个唯一的短码(如 https://s.wx.qq.com/aBcDeF)。

  1. 用户请求生成短链接(含原始 URL 与自定义参数)。
  2. 系统校验合法性(URL 格式、域名白名单、安全扫描)。
  3. 调用分布式 ID 生成器获取唯一 ID。
  4. 将 ID 通过 Base62 编码转为短码。
  5. 存储映射关系(短码 → 长 URL + 元数据)。
  6. 写入缓存。
  7. 返回短链接。
D2 Diagram
qtopie.github.io

跳转链路

用户访问短链接时,系统完成从短码到原始 URL 的查找和 301/302 跳转。

  1. DNS 解析到接入层。
  2. 负载均衡分发到网关。
  3. 网关提取短码,转发至 Redirect Service。
  4. 查询缓存(多级缓存架构)。
  5. 缓存命中 → 返回目标 URL → 浏览器 301/302 跳转。
  6. 缓存未命中 → 回源数据库 → 回填缓存 → 跳转。
  7. 异步发送点击事件到消息队列,用于后续分析。
D2 Diagram
qtopie.github.io

关键技术架构

分布式 ID 生成

短码是系统的核心标识,需要满足全局唯一、生成高效、趋势递增(便于分库分表)的要求。

Snowflake 方案

经典的雪花算法生成 64-bit 整数:

位段长度说明
符号位1 bit固定为 0
时间戳41 bit毫秒级时间戳,可用 69 年
工作机器 ID10 bit支持 1024 个节点
序列号12 bit毫秒内自增,单节点每毫秒支持 4096 个 ID

改进点:

Base62 编码

将 Snowflake ID(或其他唯一 ID)转为短码:

D2 Diagram
qtopie.github.io

存储架构

读流量(短码查询)—— 缓存优先

层级技术用途容量延迟
L1本地内存(Caffeine/Guava)热链接缓存MB 级< 1ms
L2Redis Cluster全量缓存GB ~ TB1~5ms
L3MySQL/NoSQL持久化存储TB 级5~20ms

Key 设计:

短码 → { longUrl, createdAt, expiresAt, ownerId }
Example: aBcDeF → { "longUrl": "https://...", "createdAt": 1721600000, ... }

写流量 —— 异步批处理

分库分表策略

高并发处理

负载均衡

Client → DNS (GeoDNS) → LVS (四层) → Nginx (七层) → Gateway → Service

微服务拆分

服务职责部署策略
Shorten Service生成短链接、校验弹性伸缩(根据写入 QPS)
Redirect Service短码跳转查询多副本部署,CPU 密集
Admin Service链接管理、数据统计低频率,可独立扩缩
Analytics Service点击流分析、报表异步消费消息队列

服务间通过 RPC(gRPC/Thrift)通信,服务发现依赖 Consul/K8s DNS。

消息队列削峰

跳转链路的点击事件和写请求通过消息队列进行异步处理:

D2 Diagram
qtopie.github.io

优化策略

热链接处理

热点链接(如大促活动链接)在海量用户同时点击时需要特殊处理。

多级缓存

D2 Diagram
qtopie.github.io

热链接识别:

本地缓存一致性:

301 vs 302 跳转

状态码浏览器缓存适用场景说明
301永久缓存永久链接、匿名短链浏览器缓存跳转结果,后续请求直接跳转,服务端压力小
302不缓存推广链接、A/B 测试每次请求都经过服务端,可统计点击量、校验状态、动态调整

生产建议:默认使用 302 跳转,配合异步记录点击日志。对于需要极致性能的场景(如短信/推送中的固定链接),可改用 301 + CDN 加速。

容错设计

多活部署

缓存容错

故障场景策略说明
Redis 宕机本地缓存 → 直连 DB本地缓存持续提供服务,DB 限流保护
Redis 分片故障降级到同分片副本 / 一致性哈希漂移少量短码不可用,大部分正常
缓存雪崩过期时间加随机偏移 + 本地缓存兜底防止批量过期导致 DB 被打满
缓存击穿互斥锁(分布式锁)控制回源单短码同时只有一个线程回源 DB
缓存穿透布隆过滤器 + 空值缓存拦截不存在短码的查询

服务熔断与降级

依赖治理

D2 Diagram
qtopie.github.io

总结

短链接系统的核心挑战在于 极高读 QPS + 写一致性 + 高可用


参考

  • Twitter Snowflake ID 设计
  • Redis Cluster 分片原理
  • Caffeine Cache W-TinyLFU 淘汰策略
  • 《数据密集型应用系统设计》