Files
interview/questions/design-seckill.md
yasinshaw 71e3497bfd feat: add comprehensive system design interview questions
- design-seckill.md: 秒杀系统设计
- design-shorturl.md: 短链接系统设计
- design-lbs.md: LBS附近的人系统设计
- design-im.md: 即时通讯系统设计
- design-feed.md: 社交信息流系统设计

Each document includes:
- Requirements analysis and data volume assessment
- Technical challenges
- System architecture design
- Database design
- Caching strategies
- Scalability considerations
- Practical project experience
- Alibaba P7 level additional points

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-28 23:43:36 +08:00

318 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 秒杀系统设计
## 需求分析和数据量评估
### 需求分析
- **核心功能**:商品秒杀、库存管理、下单支付、用户限流
- **业务场景**双十一、618等大促活动商品短时间内高并发抢购
- **QPS评估**假设10万用户同时抢购QPS可达10万+
- **峰值预期**高峰期QPS可达50万+
- **数据规模**商品10万+用户1000万+订单日峰值1亿+
### 数据量评估
- **商品表**10万条日均查询100万次
- **库存表**10万条秒杀期间读写10万+/秒
- **订单表**日峰值1亿条历史数据10亿+
- **用户表**1000万条日均查询500万次
- **Redis缓存**商品信息100万条库存信息10万条
## 核心技术难点
### 1. 高并发库存管理
- 传统数据库锁无法支撑高并发
- 需要分布式锁配合缓存实现
- 库存扣减的原子性问题
### 2. 超卖问题
- 库存与订单不一致
- 需要最终一致性保证
- 重复下单处理
### 3. 限流策略
- 全局限流、用户限流、商品限流
- 限流算法选择(令牌桶、漏桶)
- 限流后的用户体验
### 4. 数据一致性
- 缓存与数据库的一致性
- 分布式事务处理
- 幂等性保证
## 系统架构设计
### 总体架构
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ CDN/Static │ │ Load Balance │ │ API Gateway │
│ Cache │◄──►│ (Nginx) │◄──►│ (Gateway) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
┌───────────────────────────────────┼───────────────────────────────────┐
│ │ │
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 业务服务 │ │ 业务服务 │ │ 业务服务 │
│ (微服务) │ │ (微服务) │ │ (微服务) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────────────────┼───────────────────────────────────┘
┌───────────────────────────────────┼───────────────────────────────────┐
│ │ │
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Redis集群 │ │ 消息队列 │ │ 数据库集群 │
│ (缓存+分布式锁)│ │ (Kafka/RocketMQ)│ │ (MySQL分库分表)│
└─────────────────┘ └─────────────────┘ └─────────────────┘
```
### 关键组件
#### 1. 流量层
- **CDN**:静态资源加速
- **Web服务器**Nginx负载均衡
- **API网关**:限流、路由、认证
#### 2. 服务层
- **秒杀服务**:核心业务逻辑
- **订单服务**:订单处理
- **库存服务**:库存管理
- **支付服务**:支付处理
#### 3. 存储层
- **Redis集群**:缓存和分布式锁
- **数据库集群**MySQL分库分表
- **消息队列**:异步处理
#### 4. 监控层
- **监控系统**:实时监控
- **告警系统**:异常告警
- **日志系统**:业务日志
## 数据库设计
### 商品表
```sql
CREATE TABLE `seckill_product` (
`id` bigint NOT NULL AUTO_INCREMENT,
`product_id` bigint NOT NULL COMMENT '商品ID',
`product_name` varchar(255) NOT NULL COMMENT '商品名称',
`product_desc` text COMMENT '商品描述',
`original_price` decimal(10,2) NOT NULL COMMENT '原价',
`seckill_price` decimal(10,2) NOT NULL COMMENT '秒杀价',
`stock_count` int NOT NULL COMMENT '库存数量',
`seckill_count` int NOT NULL DEFAULT 0 COMMENT '已秒杀数量',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_product_id` (`product_id`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
### 订单表
```sql
CREATE TABLE `seckill_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(64) NOT NULL COMMENT '订单号',
`user_id` bigint NOT NULL COMMENT '用户ID',
`product_id` bigint NOT NULL COMMENT '商品ID',
`product_name` varchar(255) NOT NULL COMMENT '商品名称',
`seckill_price` decimal(10,2) NOT NULL COMMENT '秒杀价',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
### 用户表
```sql
CREATE TABLE `seckill_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`email` varchar(100) NOT NULL COMMENT '邮箱',
`phone` varchar(20) NOT NULL COMMENT '手机号',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
## 缓存策略
### Redis缓存设计
```typescript
// 商品信息缓存
const PRODUCT_CACHE_PREFIX = 'product:';
const PRODUCT_CACHE_TTL = 3600; // 1小时
// 库存缓存
const STOCK_CACHE_PREFIX = 'stock:';
const STOCK_CACHE_TTL = 300; // 5分钟
// 分布式锁
const LOCK_PREFIX = 'lock:';
const LOCK_TTL = 10; // 10秒
// 用户限流
const RATE_LIMIT_PREFIX = 'rate_limit:';
const RATE_LIMIT_TTL = 1; // 1秒
```
### 缓存策略
1. **多级缓存**
- CDN缓存静态资源
- Redis缓存热点数据
- 本地缓存减少网络IO
2. **缓存更新策略**
- 主动更新:秒杀开始前预加载
- 异步更新:异步刷新数据库
- 失效策略设置合理的TTL
3. **缓存预热**
- 秒杀开始前加载商品信息
- 预热库存信息到Redis
- 预加载热门商品
### 分布式锁实现
```java
public boolean acquireDistributedLock(String lockKey, String requestId, long expireTime) {
String result = redisTemplate.opsForValue().set(
lockKey,
requestId,
expireTime,
TimeUnit.MILLISECONDS
);
return "OK".equals(result);
}
public boolean releaseDistributedLock(String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
"return redis.call('del', KEYS[1]) " +
"else " +
"return 0 " +
"end";
Long result = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class),
Collections.singletonList(lockKey),
requestId);
return result != null && result > 0;
}
```
## 扩展性考虑
### 1. 水平扩展
- **无状态服务**:服务实例可以水平扩展
- **数据分片**按商品ID分片
- **读写分离**:主库写入,从库读取
### 2. 垂直扩展
- **服务拆分**:按业务域拆分微服务
- **数据分层**:热数据、温数据、冷数据分离
- **缓存层扩展**Redis集群扩容
### 3. 异步处理
- **消息队列**:订单处理异步化
- **事件驱动**:使用事件总线
- **最终一致性**:保证数据最终一致
### 4. 容灾备份
- **多活架构**:多机房部署
- **故障转移**:自动故障检测和转移
- **数据备份**:定时备份和实时同步
## 实际项目经验
### 1. 技术栈选择
- **前端**Vue.js + React
- **后端**Spring Boot + Node.js
- **数据库**MySQL + Redis
- **缓存**Redis Cluster
- **消息队列**Kafka
- **监控**Prometheus + Grafana
### 2. 性能优化
- **JVM调优**调整堆大小和GC策略
- **MySQL优化**索引优化、慢SQL优化
- **Redis优化**:集群扩容、内存优化
- **网络优化**:连接池配置、超时设置
### 3. 运维部署
- **容器化**Docker + Kubernetes
- **CI/CD**Jenkins + GitLab
- **监控告警**ELK Stack + AlertManager
- **压测工具**JMeter + Locust
### 4. 灰度发布
- **蓝绿部署**:无缝切换
- **金丝雀发布**:逐步放量
- **流量控制**:按比例分配流量
## 阿里P7加分项
### 1. 架构设计能力
- **高可用架构**设计99.99%可用性的系统
- **高性能架构**支持百万级QPS
- **高扩展架构**:支持弹性扩缩容
### 2. 技术深度
- **分布式事务**Seata、TCC、Saga
- **分布式缓存**Redis集群、一致性哈希
- **分布式锁**Redis、Zookeeper、Etcd
### 3. 业务理解
- **电商业务**:理解秒杀业务场景
- **用户行为**:分析用户抢购习惯
- **风控系统**:防刷、防作弊机制
### 4. 团队管理
- **技术团队**带领10人+技术团队
- **项目管控**:管理千万级用户项目
- **技术方案评审**:评审核心技术方案
### 5. 前沿技术
- **Serverless**:秒杀函数化
- **云原生**K8s微服务架构
- **AI应用**:智能推荐、风控
## 面试常见问题
### 1. 秒杀系统如何防止超卖?
- 使用Redis预减库存
- 分布式锁控制并发
- 数据库唯一约束
- 消息队列异步处理
### 2. 如何实现限流策略?
- 令牌桶算法
- 漏桶算法
- Redis计数器
- Nginx限流模块
### 3. 分布式锁的实现方式?
- Redis RedLock
- Zookeeper
- Etcd
- 数据库悲观锁
### 4. 如何保证数据一致性?
- 最终一致性
- 消息队列补偿
- 定时任务对账
- 幂等性设计
### 5. 秒杀系统的瓶颈在哪里?
- 库存查询
- 下单逻辑
- 支付处理
- 库存同步