
1) 【一句话结论】
针对百万级订单峰值,核心架构通过微服务拆分实现业务解耦,采用异步消息队列(如Kafka)解耦订单与库存服务,结合分布式缓存(Redis)加速热点数据访问,数据库分库分表(按订单ID哈希分库、按月分表)缓解数据压力,并辅以负载均衡、熔断降级、多机房部署等高可用策略,确保系统高并发、低延迟、高可用。
2) 【原理/概念讲解】
3) 【对比与适用场景】
消息队列(Kafka vs RabbitMQ)
| 特性/组件 | Kafka | RabbitMQ |
|---|---|---|
| 持久化 | 日志存储磁盘,消息持久化 | 支持持久化,默认非持久化 |
| 副本机制 | 多副本备份(3副本),高可用 | 队列模型,副本较少 |
| 消息确认 | 生产者ACK+消费者ACK(确保不丢失) | 生产者ACK,消费者可选 |
| 幂等性支持 | 需手动实现(消息唯一ID+重试) | 需手动实现(消息唯一ID+重试) |
| 使用场景 | 实时数据处理、日志收集、高吞吐异步 | 微服务解耦、任务队列、消息模式多样 |
| 注意点 | 需管理消息重试逻辑,避免循环 | 需配置持久化策略,避免消息丢失 |
数据库分库分表(垂直分库 vs 水平分表)
| 方式 | 垂直分库 | 水平分表 |
|---|---|---|
| 定义 | 按业务模块拆分数据库(如订单库、用户库) | 按数据量或时间拆分表(如订单表按月分表) |
| 分片键 | 业务模块(订单库、用户库) | 时间(月)、ID(订单ID按月分表) |
| 跨库事务 | 复杂(需分布式事务,如Saga) | 表间关联复杂,需路由 |
| 数据倾斜 | 可能(订单库负载不均) | 可能(分表后数据分布不均) |
| 使用场景 | 业务模块独立,数据量不大 | 单表数据量过大(如订单表百万级) |
| 注意点 | 需跨库事务解决方案(Saga更推荐) | 需表级路由,避免数据倾斜 |
4) 【示例】(订单创建流程伪代码,含幂等性处理)
1. 客户端调用订单服务创建订单(POST /orders,参数:用户ID、商品ID、数量)
2. 订单服务验证用户信息(Redis缓存用户信息,若缓存未命中则查询数据库)
3. 订单服务查询商品库存(通过消息队列发送“查询库存”消息给库存服务)
4. 库存服务处理消息,返回库存是否充足(若充足,则扣减库存,并更新Redis缓存库存)
5. 库存服务发送“库存扣减完成”消息给订单服务
6. 订单服务消费消息,检查消息唯一标识(订单ID+时间戳),若已处理则跳过,否则确认库存扣减成功后,创建订单(写入数据库订单表,并更新Redis订单状态为“已创建”)
7. 订单服务返回订单创建结果(成功/失败)
8. 若库存扣减失败,库存服务发送“库存扣减失败”消息,订单服务通过Saga模式补偿:重试库存扣减或回滚订单(删除已创建订单,恢复库存)
5) 【面试口播版答案】
“面试官您好,针对百万级订单峰值,我设计的核心架构是微服务拆分+异步消息队列解耦+分布式缓存+数据库分库分表,并辅以高可用策略。首先,服务拆分:将系统拆为订单、库存、支付等微服务,通过API网关统一入口,订单创建与库存扣减解耦,避免阻塞。比如订单服务创建订单后,通过Kafka发送库存扣减消息,库存服务异步处理。其次,消息队列:用Kafka持久化存储,多副本备份,确保消息不丢失,同时通过消息唯一标识(订单ID+时间戳)保证幂等性,避免重复扣减库存。然后,分布式缓存:Redis集群缓存订单状态,订单创建后立即更新缓存,针对缓存雪崩用随机过期时间,击穿用互斥锁,穿透用布隆过滤器。接着,数据库分库分表:订单表按订单ID哈希分库(10个库),按月分表,解决数据量过大,同时通过动态分片调整负载。最后,高可用:Nginx负载均衡分发请求,Hystrix熔断降级,多机房部署(主备切换),保证系统稳定。这样能支撑百万级峰值,低延迟,高可用。”
6) 【追问清单】
7) 【常见坑/雷区】