
1) 【一句话结论】
针对南光集团能源贸易订单系统的高并发与强一致性需求,采用微服务拆分架构,核心通过Saga模式实现分布式事务的最终一致性(满足业务强一致性要求),结合多活部署、负载均衡及数据库主从复制保障系统高可用性,确保订单处理各环节(库存、支付等)的可靠执行。
2) 【原理/概念讲解】
老师先解释分布式事务的挑战:传统事务(如XA)无法跨服务,长事务(订单→库存→支付)在高并发下易阻塞,因此引入Saga模式——将长事务拆分为多个本地事务,通过“补偿机制”保证最终状态正确。类比:Saga像“多人记账”,先记“借”,再记“贷”,若“贷”失败,需“冲回”之前的“借”,确保账目平衡。高可用设计:多活部署(多实例服务,主备切换)、负载均衡(Nginx+Keepalived)、数据库主从复制(主库故障自动切换),避免单点故障。
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 分布式事务(两阶段提交) | 跨服务事务,通过XA协议保证强一致性 | 严格强一致性,但高并发下易阻塞(事务提交时阻塞后续操作) | 需强一致性且业务逻辑简单(如金融核心交易,如银行转账) | 适合低并发场景,高并发下性能差,可能导致服务雪崩 |
| Saga模式 | 长事务拆分为短事务+补偿机制 | 最终一致性,高并发友好(每个短事务快速完成,失败后补偿) | 需强一致性但业务逻辑复杂(如能源贸易多环节,库存、支付、通知) | 补偿逻辑需严谨,避免死循环(如补偿失败后再次补偿导致无限循环) |
| 最终一致性 | 通过异步消息、事件溯源保证一致性 | 低延迟,适合高并发(读多写少,允许短暂不一致) | 对一致性要求不高的场景(如通知、日志记录) | 需容忍短暂不一致,适合读多写少,如用户通知 |
4) 【示例】
订单创建流程(伪代码):
createOrder(orderId, amount):
stock-reduce,消息:{orderId: 1, amount: 100})。updateStock(orderId, -amount),返回“库存扣减成功”。stock-compensation,消息:{orderId: 1})。updateOrderStatus(orderId, "cancelled"),回滚订单。payment,消息:{orderId: 1, amount: 100})。updateBalance(orderId, -amount),返回“支付成功”。payment-compensation,消息:{orderId: 1})。updateOrderStatus(orderId, "cancelled"),回滚订单。notify,消息:{orderId: 1, status: "completed"})。5) 【面试口播版答案】
面试官您好,针对南光集团能源贸易订单系统的高并发和强一致性需求,我设计的整体架构是微服务拆分+Saga模式保障一致性+多活高可用。系统拆分为订单、库存、支付、通知等微服务,通过消息队列(如Kafka)解耦服务间调用。订单创建时,先创建订单(状态:待支付),然后发送库存扣减消息,库存服务消费后扣减库存并返回成功,接着支付服务消费支付消息完成支付,最后通知服务发送通知。如果库存扣减失败,库存服务会发送补偿消息,订单服务消费补偿消息后回滚订单状态(取消),这样保证库存扣减的强一致性。高可用方面,每个微服务部署多实例,通过负载均衡(如Nginx)分发请求,数据库采用主从复制,主库故障时自动切换到从库,确保服务不中断。这样既解决了分布式事务的一致性问题,又保证了系统的高可用性。
6) 【追问清单】
7) 【常见坑/雷区】