
1) 【一句话结论】
针对百万级用户、千级订单/秒的电商场景,设计基于微服务解耦的订单系统,通过API网关统一入口,结合限流(令牌桶算法)、Redis缓存(含预热)、数据库分库分表(水平分库+时间分表+垂直拆分+读写分离)、Kafka异步消息队列(带幂等性),以及最终一致性方案(ACK+重试+补偿),实现高并发、高可用,核心是资源隔离、异步化与数据一致性保障。
2) 【原理/概念讲解】
老师讲解各组件作用与关键技术:
3) 【对比与适用场景】
| 算法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 令牌桶 | 维持固定大小桶,按固定速率放令牌,请求消耗令牌 | 限制最大并发数,平滑流量 | 电商首页、登录接口(需要平滑流量) | 需设置桶容量和速率,避免突发流量 |
| 漏桶 | 桶以固定速率流出水滴,流入水滴若超过桶容量则溢出 | 限制最大流量,突发流量被丢弃 | API接口(如短信验证码)、严格限制流量 | 丢弃突发流量,可能导致业务中断 |
| 组件 | Kafka | RabbitMQ | 适用场景 |
|---|---|---|---|
| 特性 | 高吞吐、持久化、分区、支持集群 | 队列模型、支持多种消息模式 | 电商订单状态变更(高吞吐、持久化) |
4) 【示例】
订单创建流程(伪代码):
# 订单服务处理订单创建
def create_order(order_data):
# 1. 限流检查(按用户维度)
if not rate_limiter.allow(order_data['user_id']):
return {"code": 429, "msg": "请求太频繁"}
# 2. 查询库存(缓存优先)
stock_key = f"stock:{order_data['sku_id']}"
stock = redis.get(stock_key)
if stock is None:
# 缓存穿透处理:加互斥锁
with redis.lock(stock_key, timeout=10):
stock = redis.get(stock_key)
if stock is None:
stock = mysql.query_one("SELECT stock FROM inventory WHERE sku_id = ?", order_data['sku_id'])
redis.setex(stock_key, 3600, stock) # 缓存有效时间
if int(stock) < order_data['quantity']:
return {"code": 400, "msg": "库存不足"}
# 3. 生成订单(写入数据库)
order_id = mysql.insert("INSERT INTO orders (order_id, user_id, sku_id, quantity, total_price) VALUES (?, ?, ?, ?, ?)",
order_data['order_id'], order_data['user_id'], order_data['sku_id'], order_data['quantity'], order_data['total_price'])
# 4. 发送消息到Kafka(异步通知库存服务)
kafka_producer.send("order-created", value=order_data, key=order_id)
return {"code": 200, "order_id": order_id}
# 库存服务消费消息扣减库存
def consume_order_created_message(message):
order_data = message.value
# 幂等性检查:检查是否已处理
if redis.exists(f"order_processed:{order_data['order_id']}"):
return # 跳过处理
# 扣减库存
result = mysql.update("UPDATE inventory SET stock = stock - ? WHERE sku_id = ?", order_data['quantity'], order_data['sku_id'])
if result > 0:
redis.setex(f"order_processed:{order_data['order_id']}", 3600, "true") # 标记已处理
else:
# 库存扣减失败,重试或补偿
kafka_producer.send("retry-order-created", value=order_data, key=order_data['order_id'])
5) 【面试口播版答案】
“面试官您好,针对百万级用户、千级订单/秒的电商订单系统,我设计的核心架构是微服务解耦+分布式组件协同。首先,订单、库存、支付等模块通过API网关统一入口,部署限流组件(令牌桶算法)防止系统过载。订单服务读取库存时,优先从Redis缓存获取(缓存穿透用互斥锁+空值缓存解决),若缓存未命中则查询MySQL数据库,并将结果缓存。订单创建后,写入MySQL订单表,同时发送消息到Kafka,库存服务消费消息后更新库存表。数据库层面,订单表按订单ID取模分库(如订单ID % 8),按时间分表(如按月),库存表垂直拆分,并配置读写分离。消息队列用于异步处理,避免订单服务阻塞,提升吞吐。整体通过限流、缓存、分库分表(含读写分离)、消息队列及最终一致性方案(消息ACK+重试+补偿),实现高并发、高可用,满足百万级用户、千级订单/秒的处理需求。”
6) 【追问清单】
7) 【常见坑/雷区】