本文档描述了秒杀系统的核心接口设计,包括接口定义、请求响应格式、错误码、限流策略等。
- 前端:React/Vue + CDN
- 网关:Spring Cloud Gateway + 限流
- 应用服务:Spring Boot + Redis + MySQL
- 消息队列:Kafka/RocketMQ
- 协议:HTTPS
- 数据格式:JSON
- 编码:UTF-8
- 时间格式:yyyy-MM-dd HH:mm:ss
- 接口前缀:/api/seckill/v1
{
"code": 200,
"message": "success",
"data": {},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
| 错误码 | 描述 | 说明 |
|---|
| 200 | 成功 | 请求成功 |
| 400 | 参数错误 | 请求参数有误 |
| 401 | 未授权 | 需要登录 |
| 403 | 禁止访问 | 权限不足 |
| 429 | 请求过快 | 触发限流 |
| 500 | 系统错误 | 服务器内部错误 |
| 1001 | 活动未开始 | 秒杀活动还未开始 |
| 1002 | 活动已结束 | 秒杀活动已经结束 |
| 1003 | 库存不足 | 商品库存不足 |
| 1004 | 重复下单 | 用户已经购买过该商品 |
| 1005 | 验证码错误 | 验证码不正确 |
- 接口路径:
GET /api/seckill/v1/goods/list - 接口描述:获取秒杀商品列表
- 限流策略:1000 QPS/IP
{
"page": 1,
"size": 10,
"status": "ONGOING"
}
| 参数名 | 类型 | 必填 | 描述 | 示例 |
|---|
| page | int | 否 | 页码,默认1 | 1 |
| size | int | 否 | 每页数量,默认10,最大50 | 10 |
| status | string | 否 | 活动状态:WAITING/ONGOING/FINISHED | ONGOING |
{
"code": 200,
"message": "success",
"data": {
"total": 100,
"list": [
{
"goodsId": "123456",
"goodsName": "iPhone 15",
"goodsImage": "https://cdn.example.com/iphone15.jpg",
"originalPrice": 5999.00,
"seckillPrice": 3999.00,
"stock": 1000,
"soldCount": 500,
"startTime": "2024-01-01 00:00:00",
"endTime": "2024-01-01 02:00:00",
"status": "ONGOING",
"progress": 50
}
]
},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
- 接口路径:
GET /api/seckill/v1/goods/{goodsId} - 接口描述:获取秒杀商品详情
- 限流策略:2000 QPS/IP
- 缓存策略:Redis缓存5分钟
| 参数名 | 类型 | 必填 | 描述 | 示例 |
|---|
| goodsId | string | 是 | 商品ID | 123456 |
{
"code": 200,
"message": "success",
"data": {
"goodsId": "123456",
"goodsName": "iPhone 15",
"goodsDesc": "全新iPhone 15,超强性能",
"goodsImage": "https://cdn.example.com/iphone15.jpg",
"goodsImages": [
"https://cdn.example.com/iphone15_1.jpg",
"https://cdn.example.com/iphone15_2.jpg"
],
"originalPrice": 5999.00,
"seckillPrice": 3999.00,
"stock": 1000,
"soldCount": 500,
"startTime": "2024-01-01 00:00:00",
"endTime": "2024-01-01 02:00:00",
"status": "ONGOING",
"rules": [
"每人限购1件",
"不支持退换货",
"全国包邮"
],
"canBuy": true,
"buyLimit": 1,
"userBought": 0
},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
- 接口路径:
POST /api/seckill/v1/captcha/get - 接口描述:获取秒杀验证码
- 限流策略:10 次/分钟/用户
{
"goodsId": "123456",
"userId": "789"
}
{
"code": 200,
"message": "success",
"data": {
"captchaId": "cap_123456",
"captchaImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
"expireTime": 300
},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
- 接口路径:
POST /api/seckill/v1/captcha/verify - 接口描述:验证验证码
- 限流策略:30 次/分钟/用户
{
"captchaId": "cap_123456",
"captchaCode": "A3B7",
"userId": "789"
}
{
"code": 200,
"message": "success",
"data": {
"verified": true,
"token": "verify_token_123456",
"expireTime": 600
},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
- 接口路径:
POST /api/seckill/v1/order/create - 接口描述:创建秒杀订单
- 限流策略:100 QPS/用户
- 幂等性:基于用户ID+商品ID+时间窗口
Authorization: Bearer {token}
X-Verify-Token: {verifyToken}
X-Request-Id: {requestId}
{
"goodsId": "123456",
"quantity": 1,
"addressId": "addr_123",
"timestamp": 1704067200000,
"sign": "a1b2c3d4e5f6"
}
| 参数名 | 类型 | 必填 | 描述 | 示例 |
|---|
| goodsId | string | 是 | 商品ID | 123456 |
| quantity | int | 是 | 购买数量,固定为1 | 1 |
| addressId | string | 是 | 收货地址ID | addr_123 |
| timestamp | long | 是 | 请求时间戳(毫秒) | 1704067200000 |
| sign | string | 是 | 请求签名 | a1b2c3d4e5f6 |
sign = MD5(goodsId + quantity + addressId + timestamp + secretKey)
{
"code": 200,
"message": "下单成功",
"data": {
"orderId": "order_123456789",
"status": "SUCCESS",
"queuePosition": 0,
"estimatedTime": 0,
"payUrl": "https://pay.example.com/order_123456789"
},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
排队中:
{
"code": 200,
"message": "正在排队中",
"data": {
"orderId": "order_123456789",
"status": "QUEUING",
"queuePosition": 15,
"estimatedTime": 30
}
}
库存不足:
{
"code": 1003,
"message": "库存不足",
"data": null
}
- 接口路径:
GET /api/seckill/v1/order/{orderId}/status - 接口描述:查询订单状态
- 限流策略:500 QPS/用户
{
"code": 200,
"message": "success",
"data": {
"orderId": "order_123456789",
"status": "UNPAID",
"goodsInfo": {
"goodsId": "123456",
"goodsName": "iPhone 15",
"goodsImage": "https://cdn.example.com/iphone15.jpg",
"seckillPrice": 3999.00
},
"quantity": 1,
"totalAmount": 3999.00,
"createTime": "2024-01-01 12:00:00",
"payExpireTime": "2024-01-01 12:15:00",
"payUrl": "https://pay.example.com/order_123456789"
},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
- 接口路径:
GET /api/seckill/v1/user/orders - 接口描述:获取用户秒杀订单列表
- 限流策略:100 QPS/用户
{
"page": 1,
"size": 10,
"status": "ALL"
}
{
"code": 200,
"message": "success",
"data": {
"total": 5,
"list": [
{
"orderId": "order_123456789",
"goodsId": "123456",
"goodsName": "iPhone 15",
"goodsImage": "https://cdn.example.com/iphone15.jpg",
"seckillPrice": 3999.00,
"quantity": 1,
"status": "PAID",
"createTime": "2024-01-01 12:00:00",
"payTime": "2024-01-01 12:02:00"
}
]
},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
- 接口路径:
GET /api/seckill/v1/queue/{queueId}/status - 接口描述:查询排队状态
- 限流策略:1000 QPS/IP
{
"code": 200,
"message": "success",
"data": {
"queueId": "queue_123456",
"position": 15,
"estimatedTime": 30,
"status": "WAITING",
"canEnter": false
},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
| 接口 | 限流策略 | 说明 |
|---|
| 商品列表 | 1000 QPS/IP | 基于IP限流 |
| 商品详情 | 2000 QPS/IP | 基于IP限流 |
| 获取验证码 | 10次/分钟/用户 | 基于用户限流 |
| 验证验证码 | 30次/分钟/用户 | 基于用户限流 |
| 秒杀下单 | 100 QPS/用户 | 基于用户限流 |
| 订单查询 | 500 QPS/用户 | 基于用户限流 |
- 令牌桶算法:用于平滑突发流量
- 滑动窗口:用于精确控制时间窗口内请求数
- 分布式限流:基于Redis实现
{
"code": 429,
"message": "请求过快,请稍后再试",
"data": {
"retryAfter": 5
},
"timestamp": "2024-01-01 12:00:00",
"traceId": "abc123"
}
- 验证码验证:下单前必须通过验证码验证
- 签名验证:关键接口需要签名验证
- 时间戳验证:请求时间戳不能超过5分钟
- 幂等性控制:防止重复提交
- 黑名单机制:恶意用户加入黑名单
// 前端签名示例
function generateSign(params, secretKey) {
const sortedKeys = Object.keys(params).sort();
const signString = sortedKeys.map(key => `${key}=${params[key]}`).join('&') + `&key=${secretKey}`;
return md5(signString);
}
Authorization: Bearer {userToken}
X-Verify-Token: {captchaToken}
X-Request-Id: {uniqueRequestId}
X-Timestamp: {timestamp}
X-Sign: {signature}
| 数据类型 | 缓存时间 | 更新策略 |
|---|
| 商品列表 | 5分钟 | 定时更新 |
| 商品详情 | 5分钟 | 主动更新 |
| 库存信息 | 实时 | 实时更新 |
| 用户信息 | 30分钟 | 被动更新 |
- 索引优化:关键字段建立合适索引
- 读写分离:读操作走从库
- 分库分表:订单表按用户ID分表
- 连接池:合理配置数据库连接池
- 订单创建:异步处理订单详情
- 库存同步:异步同步库存到数据库
- 消息通知:异步发送下单成功通知
- QPS:每秒请求数
- RT:响应时间
- 成功率:接口成功率
- 库存准确性:库存一致性检查
- 下单成功率:下单成功的比例
- QPS > 阈值:扩容告警
- RT > 1s:性能告警
- 成功率 < 99%:异常告警
- 库存不一致:数据告警
- 应用服务器:8C16G * 10台
- Redis集群:16G * 6台
- MySQL主从:32G * 3台
- Kafka集群:16G * 3台
# docker-compose.yml
version: '3.8'
services:
seckill-app:
image: seckill:v1.0
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
deploy:
replicas: 10
resources:
limits:
cpus: '2'
memory: 4G
# k8s HPA配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: seckill-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: seckill-app
minReplicas: 5
maxReplicas: 50
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- 正常流程测试:完整秒杀流程
- 并发测试:高并发下单测试
- 限流测试:触发限流机制
- 异常测试:各种异常场景
- 性能测试:压力测试
- 商品详情接口:RT < 100ms,QPS > 10000
- 秒杀下单接口:RT < 500ms,QPS > 5000
- 订单查询接口:RT < 200ms,QPS > 3000
| 版本 | 日期 | 变更内容 | 作者 |
|---|
| v1.0 | 2024-01-01 | 初始版本 | 牛哥 |
| v1.1 | 2024-01-15 | 新增排队机制 | 牛哥 |
| v1.2 | 2024-02-01 | 优化限流策略 | 牛哥 |
文档维护者:牛哥
最后更新时间:2024-01-01
文档状态:已发布