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

12 KiB
Raw Blame History

秒杀系统设计

需求分析和数据量评估

需求分析

  • 核心功能:商品秒杀、库存管理、下单支付、用户限流
  • 业务场景双十一、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. 监控层

  • 监控系统:实时监控
  • 告警系统:异常告警
  • 日志系统:业务日志

数据库设计

商品表

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;

订单表

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;

用户表

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缓存设计

// 商品信息缓存
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
    • 预加载热门商品

分布式锁实现

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/CDJenkins + 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. 秒杀系统的瓶颈在哪里?

  • 库存查询
  • 下单逻辑
  • 支付处理
  • 库存同步