
1) 【一句话结论】在游戏跨服务调用中,推荐采用Saga模式结合最终一致性策略,通过拆分长事务为短事务并设计补偿逻辑来保证数据一致性,交易失败时通过补偿事务回滚,而非强一致性方案(如两阶段提交)。
2) 【原理/概念讲解】老师来解释几个核心概念:
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Saga模式 | 拆分长事务为多个短事务,每个短事务有补偿操作 | 最终一致性,允许短暂不一致,通过补偿恢复 | 游戏跨服务调用(如用户-交易),业务复杂,需高可用 | 补偿逻辑需可靠,避免死循环 |
| 两阶段提交 | 强一致性,协调者控制参与者提交/回滚 | 强一致性,但复杂,性能低,故障时可能阻塞 | 需强一致性且业务简单(如金融核心交易) | 故障时可能阻塞,复杂度高 |
4) 【示例】(伪代码示例:用户下单流程)
// 用户系统调用交易系统扣款
func userCreateOrder(userId int, amount float64) error {
// 1. 扣款(短事务1)
err := transactionSystem.DeductAmount(userId, amount)
if err != nil { // 扣款失败
// 2. 补偿事务(退款)
err = transactionSystem.RefundAmount(userId, amount)
if err != nil {
return fmt.Errorf("扣款失败且退款失败")
}
return fmt.Errorf("扣款失败,已退款")
}
// 3. 创建订单(短事务2)
err = userSystem.CreateOrder(userId, amount)
if err != nil {
// 补偿事务(删除订单)
err = userSystem.DeleteOrder(userId)
if err != nil {
return fmt.Errorf("扣款成功但订单创建失败,已删除订单")
}
return fmt.Errorf("扣款成功但订单创建失败")
}
return nil
}
交易系统扣款失败时,通过Saga的补偿事务(退款)回滚扣款操作。
5) 【面试口播版答案】
面试官您好,针对游戏跨服务调用的数据一致性,我的核心观点是:推荐使用Saga模式结合最终一致性策略,而非强一致性方案(如两阶段提交)。首先,Saga模式是将长事务拆分为多个短事务,每个短事务是本地事务,通过补偿事务保证数据一致性。比如用户下单时,用户系统创建订单(短事务1),交易系统扣款(短事务2),若扣款失败,交易系统调用退款(补偿事务)回滚。两阶段提交虽然能保证强一致性,但复杂度高,故障时可能阻塞,不适合游戏高并发场景。最终一致性允许短暂不一致,通过补偿恢复,适合游戏业务。总结来说,Saga模式结合最终一致性,既能保证数据一致性,又能保证高可用和性能。
6) 【追问清单】
7) 【常见坑/雷区】