题目
设计亿级并发短链接系统
信息
- 类型:问答
- 难度:⭐⭐⭐
考点
分布式系统设计,高并发架构,数据分片策略,缓存优化,容错处理
快速回答
核心设计要点:
- 采用62进制编码生成7位短码(支持百亿级数据)
- 分布式ID生成器(Snowflake算法)避免冲突
- 读写分离架构:写服务处理生成请求,读服务处理重定向
- 多级缓存策略:热点数据内存缓存+Redis集群+布隆过滤器
- 数据库分片:一致性哈希分库分表解决存储瓶颈
- 异步过期处理:定时任务清理过期链接
1. 系统核心需求
支持每日亿级创建请求和百亿级访问请求,99.9%的请求延迟低于50ms,数据持久化存储5年。
2. 架构设计
分层架构:
Client → LB → API Gateway → [生成服务 | 重定向服务] → 缓存层 → 分片数据库关键组件:
- 生成服务:处理短链接创建请求
- 重定向服务:处理短链接访问请求
- 分布式ID生成器:全局唯一ID保障
3. 短码生成方案
Base62编码示例:
function idToShortUrl(id) {
const base62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
let shortUrl = '';
while (id) {
shortUrl = base62[id % 62] + shortUrl;
id = Math.floor(id / 62);
}
return shortUrl.padStart(7, '0'); // 固定7位长度
}ID生成选择:
- Snowflake算法:64位ID(时间戳+机器ID+序列号)
- Redis INCR集群:预分配ID范围避免冲突
4. 高并发处理
读写分离策略:
- 写路径:生成服务 → Kafka异步写入 → 分片DB
- 读路径:重定向服务 → 内存缓存 → Redis → DB
缓存设计:
- L1缓存:Guava Cache(单机热点数据,最大10K条目)
- L2缓存:Redis集群(所有活跃数据,设置TTL)
- 布隆过滤器:拦截无效请求(错误率0.1%)
5. 数据存储方案
分片策略:
shard = hash(short_code) % 1024 // 1024个逻辑分片数据库设计:
- MySQL分库分表:16物理库 × 64表 = 1024逻辑分片
- 列设计:short_code(PK), original_url, create_time, expire_time
- 冷热分离:3个月以上数据归档到HBase
6. 重定向优化
- HTTP 301永久重定向:减少服务负载,利于SEO
- 边缘缓存:CDN缓存热门短链接的Location头
- 速率限制:Redis令牌桶控制IP访问频率
7. 容错与监控
- 故障转移:ZooKeeper实现服务发现和主备切换
- 数据补偿:Kafka死信队列重试失败写入
- 监控指标:QPS、缓存命中率、重定向延迟、错误率
8. 常见错误
- 短码冲突:未考虑分布式ID生成全局唯一性
- 缓存穿透:未设置布隆过滤器导致大量请求击穿DB
- 分片不均:未使用一致性哈希造成热点分片
- DB瓶颈:直接使用自增ID导致写入性能低下
9. 扩展知识
- 安全防护:短码防爆破(增加随机盐),恶意URL检测
- 全球化部署:基于地域的路由(如us.xxx.com → 美国机房)
- 成本优化:SSD存储热数据,机械硬盘存储归档数据
- 替代方案:考虑使用LSM-Tree数据库(Cassandra)替代MySQL