
采用微服务解耦业务,结合Redis缓存热点数据、分布式锁保障库存原子性、消息队列异步处理支付,通过数据库分库分表提升性能,并引入幂等性设计,实现秒杀场景下的高并发、低延迟订单处理。
针对高峰秒杀的高并发场景,系统设计需解决业务解耦、数据库压力、数据一致性等问题,核心技术如下:
order_id, status)或Version字段,确保支付成功后更新状态时,重复请求不会重复处理(类比:身份证号唯一,避免重复办理业务)。order_id % 8),拆分到多个数据库/表,提高读写性能(类比:大仓库拆成多个小仓库,每个小仓库负责部分商品,取货更快,避免单表压力过大)。| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 缓存穿透 | 请求不存在的数据,查询数据库 | 会导致数据库瞬间压力 | 查询不存在的数据(如空字符串用户ID) | 需布隆过滤器或空值缓存(如Redis设置空值缓存SET key "" EX 60) |
| 缓存雪崩 | 大量缓存同时过期 | 会导致数据库瞬间压力 | 缓存大量数据,且过期时间集中 | 设置随机过期时间(如EX 3600 + random(0, 3600)),避免集中过期 |
| 缓存击穿 | 高频访问的缓存未初始化,所有请求都落库 | 会导致数据库压力 | 高频访问的缓存(如秒杀商品库存) | 热点数据预加载(如定时任务预热SET stock:{product_id} 1 EX 3600),或使用互斥锁(Redis SETNX) |
| 技术选型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Redis SETNX | 原子性设置键,若不存在则设置 | 速度快、简单 | 库存扣减、秒杀抢购 | 需设置过期时间(EX 10),避免死锁 |
| Zookeeper | 集群协调服务,实现分布式锁 | 可靠、支持复杂锁 | 需要更复杂的锁逻辑 | 配置复杂,适合高可用场景 |
订单处理流程伪代码(核心步骤):
# 1. 限流(令牌桶,QPS=1000)
if not rate_limit():
return "流量过大,请稍后重试"
# 2. 检查缓存库存(分布式锁保障原子性)
stock_key = f"stock:{product_id}"
# 尝试获取分布式锁,成功则扣减库存
with redis_lock(stock_key, timeout=5):
stock = redis.get(stock_key)
if stock is None or int(stock) < 1:
return "库存不足"
redis.set(stock_key, int(stock) - 1, ex=3600) # 更新缓存库存
# 3. 生成订单ID,写入数据库(分库分表)
order_id = generate_order_id()
db.execute("INSERT INTO orders (order_id, product_id, user_id, amount) VALUES (?, ?, ?, ?)",
order_id, product_id, user_id, amount)
# 4. 发送消息到支付队列(Kafka)
kafka_producer.send("payment_queue", value=order_id)
return "下单成功,支付中"
# 1. 消费Kafka消息
order_id = kafka_consumer.receive()
# 2. 检查订单状态(幂等性,避免重复支付)
order = db.query("SELECT status FROM orders WHERE order_id = ? AND status IN ('pending', 'paid')", order_id)
if not order or order.status == 'paid':
return "订单已支付,无需处理"
# 3. 调用支付网关
payment_result = call_payment_gateway(order)
# 4. 更新订单状态(事务)
if payment_result == "success":
db.execute("UPDATE orders SET status = 'paid' WHERE order_id = ?", order_id)
send_notification(order) # 发送支付成功通知
else:
db.execute("UPDATE orders SET status = 'failed' WHERE order_id = ?", order_id)
(约90秒)
“针对高峰秒杀的高并发场景,系统设计采用微服务架构,将订单、库存、支付拆分为独立服务。通过Redis缓存热点数据(如秒杀商品库存),减少数据库压力;引入Kafka消息队列解耦订单创建与支付处理,避免阻塞。数据库通过分库分表(按订单ID哈希)提高读写性能,并使用Saga模式保证数据一致性。同时,API网关配置限流和熔断,应对突发流量。核心流程是用户下单→缓存校验库存(分布式锁保障原子性)→数据库持久化订单→消息队列触发支付→支付服务异步处理(幂等性检查),最终实现低延迟和高并发。”
SET key "" EX 60)。EX 3600 + random(0, 3600)),避免集中过期。