
1) 【一句话结论】:采用事件驱动架构,通过分布式消息队列(如Kafka)解耦订单与库存系统,结合多级缓存(Redis Stream+数据库),实现百万级订单/秒下的秒级库存同步,采用最终一致性策略,并辅以消息持久化、幂等处理及缓存预热等机制保障系统可靠性。
2) 【原理/概念讲解】:老师口吻解释关键概念。
3) 【对比与适用场景】:
| 方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 同步(数据库事务) | 订单系统直接操作库存数据库,扣减库存 | 实时性强,强一致性 | 核心业务(如支付后立即扣库存) | 高并发下易阻塞,性能瓶颈 |
| 异步(消息队列) | 订单系统发布库存扣减消息,库存系统消费 | 解耦,高并发,延迟 | 大促场景(允许延迟,保证最终一致) | 需要处理消息延迟、重试、幂等 |
| 分布式事务(Saga) | 分段本地事务,通过补偿事务保证最终一致性 | 强一致性,但性能较低 | 支付后立即扣库存的强一致性场景 | 需要维护补偿事务状态,复杂度高 |
4) 【示例】(伪代码):
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers='kafka:9092', acks='all', retries=3)
producer.send('stock-decrease-topic',
key=f'product:{product_id}'.encode(),
value=json.dumps({
'order_id': order_id,
'product_id': product_id,
'quantity': quantity
}).encode())
from kafka import KafkaConsumer
consumer = KafkaConsumer('stock-decrease-topic',
bootstrap_servers='kafka:9092',
group_id='stock-consumer',
auto_offset_reset='earliest',
enable_auto_commit=True,
value_deserializer=lambda m: json.loads(m.decode('utf-8')))
import redis
r = redis.Redis(host='redis:6379', db=0)
for msg in consumer:
order_id, product_id, quantity = msg.value['order_id'], msg.value['product_id'], msg.value['quantity']
# 幂等检查
if r.get(f'dedup:order:{order_id}'):
continue
r.set(f'dedup:order:{order_id}', '1', ex=300) # 5分钟去重
# 更新Redis库存
current_stock = r.get(f'stock:{product_id}')
if current_stock is None or int(current_stock) < quantity:
# 库存不足,记录超卖事件
log_error(f'超卖: product_id={product_id}, order_id={order_id}')
continue
r.set(f'stock:{product_id}', str(int(current_stock) - quantity))
# 更新数据库库存(持久化)
db.execute("UPDATE stock SET quantity = quantity - ? WHERE product_id = ?", quantity, product_id)
# 消费失败重试
if r.get(f'retry:{msg.key}') is None:
r.set(f'retry:{msg.key}', '1', ex=60) # 1分钟重试
import redis
r = redis.Redis(host='redis:6379', db=0)
# 订阅库存变更
r.xgroup_create('stock_updates', 'stock-group', make sure=1)
for msg in r.xreadgroup('stock-group', 'stock-consumer', {'stock_updates': '>'}):
product_id, new_quantity = msg[1]['product_id'], msg[1]['quantity']
# 更新前端库存显示
update_frontend(product_id, new_quantity)
5) 【面试口播版答案】:
针对百万级订单/秒的大促场景,我设计的系统核心是采用事件驱动架构,通过分布式消息队列(如Kafka)解耦订单与库存系统,实现秒级库存同步。具体来说,订单系统下单后,发布库存扣减事件到Kafka,库存系统消费事件扣减Redis和数据库库存,线上渠道订阅Redis Stream的库存变更消息,实现秒级更新。数据一致性采用最终一致性,通过消息持久化(Kafka日志持久化)、幂等处理(Redis去重检查)及缓存预热(大促前预置热门商品库存)保证可靠性,容错机制包括消费失败重试(指数退避)和补偿事务(Saga模式),确保系统在高并发下稳定运行。
6) 【追问清单】:
7) 【常见坑/雷区】: