
1) 【一句话结论】采用微服务架构+分布式事务(Saga模式)+多级缓存+异步消息队列+数据库分库分表(ShardingSphere实现),通过幂等性、缓存预热、消息可靠性及补偿幂等性,保障百万级订单大促下的实时性与一致性。
2) 【原理/概念讲解】系统整体架构分层,各组件功能与设计要点:
order_2024_01_01等),库存表按酒店ID+时间分表(stock_hotel_1001_2024_01),减少单表数据量,提升读写性能。order_id(唯一索引)和status(如created)索引;库存表按hotel_id+quantity(主键+索引)索引,确保分库分表后查询/写入高效。3) 【对比与适用场景】:
| 对比项 | 分库分表(ShardingSphere) | 读写分离(主从复制) |
|---|---|---|
| 定义 | 按业务维度(如酒店ID)拆分数据库节点,分表 | 主库写,从库读,数据同步 |
| 特性 | 扩展性(按需增加节点) | 读性能提升,写性能依赖主库 |
| 使用场景 | 高并发写入/读取(如百万级订单) | 读多写少场景(如查询订单) |
| 注意点 | 分片规则设计(如酒店ID范围) | 从库延迟(同步延迟) |
| 对比项 | 缓存穿透(无效请求) | 缓存雪崩(大量缓存失效) |
|---|---|---|
| 定义 | 无效key(如不存在的酒店ID)直接访问数据库 | 大量key同时失效,请求直接到数据库 |
| 特性 | 单个请求导致数据库压力 | 大量请求导致数据库雪崩 |
| 解决方案 | 布隆过滤器(过滤无效请求)+ 互斥锁(缓存未命中时加锁,防止缓存击穿) | 随机过期时间(如3600秒+随机偏移)+ 热点数据预加载(大促前加载热门数据到缓存) |
| 使用场景 | 防止无效请求冲击数据库 | 缓解大促时缓存失效压力 |
4) 【示例】(订单创建流程伪代码):
// 前端请求:POST /order/create?order_id=123456&hotel_id=1001
// 订单服务逻辑(幂等性+缓存+数据库+消息)
1. 检查订单号是否已存在(Redis分布式锁,key: "order_exists:123456"):
- 若已存在且状态为"created",返回成功。
2. 若缓存未命中(或库存<=0):
a. 查询分布式缓存(Redis)库存(key: "hotel_stock:1001"):
- 若库存>0:执行数据库事务(主库):
i. 扣减库存(UPDATE stock SET quantity=quantity-1 WHERE hotel_id=1001 AND quantity>0);
ii. 更新缓存(SET hotel_stock:1001 (new_quantity) EX 3600 + random(0, 3600));
iii. 插入订单(INSERT INTO orders (order_id, hotel_id, user_id, amount, status) VALUES (123456, 1001, 1, 299, 'created'));
iv. 更新用户余额(UPDATE user SET balance=balance-299 WHERE user_id=1);
v. 发送Kafka消息(主题: "order.created",内容: {"order_id":123456, "hotel_id":1001, "user_id":1, "amount":299})。
- 若库存<=0:查询数据库库存(SELECT quantity FROM stock WHERE hotel_id=1001)→更新缓存(预热)→同步骤2.a处理。
3. 库存服务消费Kafka消息,更新本地缓存(若需)。
4. 支付服务消费Kafka消息,调用支付接口(异步)。
5. 短信服务消费Kafka消息,发送订单确认短信(异步)。
5) 【面试口播版答案】
面试官您好,针对南光集团旅游酒店预订系统的大促百万级订单需求,我设计的系统核心是采用微服务架构+分布式事务(Saga模式)+多级缓存+异步消息处理。前端通过Nginx负载均衡处理请求,后端拆分为用户、订单、库存、支付等微服务。数据库采用分库分表(ShardingSphere实现)+读写分离,缓存分为本地缓存(提升热点数据读取速度)和分布式缓存(如Redis集群,保证高并发下的数据一致性)。订单创建时,通过订单号幂等性(检查状态后处理)避免重复下单;通过缓存预热(大促前通过定时任务加载热门酒店库存到缓存)缓解缓存雪崩;通过消息队列(Kafka)异步处理非核心流程(如支付、短信),解耦服务。分布式事务采用Saga模式,订单服务先扣减库存(本地缓存+数据库事务),再生成订单(订单表事务),最后通过消息队列通知库存、支付、短信服务,确保强一致性。这样既保证了订单的实时性(秒级响应),又通过缓存和异步处理缓解了高并发压力,确保大促期间百万级订单的一致性。
6) 【追问清单】:
7) 【常见坑/雷区】: