侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

设计亿级并发短链接系统

2025-12-14 / 0 评论 / 6 阅读

题目

设计亿级并发短链接系统

信息

  • 类型:问答
  • 难度:⭐⭐⭐

考点

分布式系统设计,高并发架构,数据分片策略,缓存优化,容错处理

快速回答

核心设计要点:

  • 采用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