设计一个每秒处理 100 万个请求(WQPS)的短链系统需要综合考虑性能、可用性和可扩展性。以下是设计方案:
1. 系统架构设计
采用微服务架构,将功能模块化,便于水平扩展和故障隔离。
核心组件:
- 短链生成服务:负责生成唯一的短链。
- 存储层:存储短链与原始 URL 的映射关系。
- API 网关:处理请求路由、负载均衡和限流。
- 监控系统:实时监控性能指标(如 QPS、延迟)。
系统架构图
2. 短链生成算法
为了支持高并发,短链生成需要高效且唯一。
推荐方案:
- 混合加密 + Base62 编码:
- 使用时间戳、随机数和用户 ID 组合生成唯一标识。
- 通过 Base62 编码将长整型转换为短字符串(如
abc123
)。
示例代码(Python):
import timedef generate_short_link():timestamp = int(time.time())random_num = int.from_bytes(os.urandom(4), byteorder='big')unique_id = (timestamp << 32) | random_numreturn base62_encode(unique_id)def base62_encode(num):chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'result = ''while num > 0:remainder = num % 62result = chars[remainder] + resultnum = num // 62return result
3. 存储层设计
存储短链与原始 URL 的映射关系,支持高并发读写。
推荐方案:
- Redis(内存数据库):
- 使用哈希表
HSET
和HGET
存储键值对。 - 支持高并发读写,延迟低。
- 使用哈希表
- MySQL + 分库分表:
- Redis 作为缓存层,底层使用 MySQL 持久化存储。
Redis 示例:
# 存储短链与原始 URL 的映射关系
redis-cli HSET short-links abc123 https://example.com# 查询短链对应的 URL
redis-cli HGET short-links abc123
4. API 网关设计
处理请求路由、负载均衡和限流。
推荐方案:
- Nginx + Lua(OpenResty):
- 使用 Nginx 处理高并发请求。
- 使用 Lua 脚本实现动态路由和限流逻辑。
- Kubernetes Ingress Controller:
- 如果使用 Kubernetes,可以使用 Istio 或 Envoy 实现 API 网关。
Nginx 配置示例:
events {worker_connections 1024;
}http {server {listen 80;location /api/shorten {proxy_pass http://short-link-service:8080;proxy_set_header X-Real-IP $remote_addr;}}
}
5. 高可用性和可扩展性
为了支持高并发和高可用,需要设计以下机制:
负载均衡:
- 使用 DNS 轮询、Nginx 或云服务提供商的负载均衡器(如 AWS ELB)。
横向扩展:
- 根据 QPS 自动扩缩容。
- 使用容器化技术(Docker + Kubernetes)部署微服务。
故障恢复:
- 使用 Redis 集群实现高可用性。
- 定期备份 MySQL 数据库。
6. 性能测试和优化
- 使用工具(如 JMeter、Chaos Monkey)模拟高并发场景,测试系统性能。
- 优化热点数据的缓存策略。
- 使用异步处理机制(如消息队列 Kafka)解耦服务。
7. 安全性设计
- 对短链进行加密,防止恶意攻击。
- 限制单个 IP 的请求频率(防 DDoS 攻击)。
- 使用 HTTPS 加密传输数据。
8. 用户体验优化
- 提供 API 文档和 SDK,方便开发者集成。
- 开放短链自定义功能(如用户可以设置自己的短链字符)。
9. 系统监控和日志
- 使用 Prometheus + Grafana 实时监控系统性能。
- 记录访问日志,支持后续分析和审计。
10. 总结
通过以上设计,系统可以在高并发场景下稳定运行,支持每秒 100 万次请求。关键在于选择合适的存储、优化算法以及合理的架构设计。
如果有需要,我可以提供更详细的代码实现或系统部署方案!