- 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>
318 lines
12 KiB
Markdown
318 lines
12 KiB
Markdown
# 秒杀系统设计
|
||
|
||
## 需求分析和数据量评估
|
||
|
||
### 需求分析
|
||
- **核心功能**:商品秒杀、库存管理、下单支付、用户限流
|
||
- **业务场景**:双十一、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. 秒杀系统的瓶颈在哪里?
|
||
- 库存查询
|
||
- 下单逻辑
|
||
- 支付处理
|
||
- 库存同步 |