
面对分布式数据一致性问题时,我会先拆解业务场景(如电商订单的库存-支付流程),通过需求分析明确一致性等级(强/最终),再结合CAP/BASE模型选择方案(如Saga模式),并设计容错机制(如超时重试、状态回滚、人工介入),最后通过测试和监控迭代优化,确保方案在可用性与一致性间平衡。
数据一致性是分布式系统核心,指多节点数据状态同步。核心概念:
| 方案 | 定义 | 特性 | 使用场景 | 极端故障容错 |
|---|---|---|---|---|
| 两阶段提交(2PC) | 领导者协调所有从属者,决定提交或回滚 | 强一致性,阻塞,单点故障(领导者故障导致全阻塞) | 需强一致性,如金融账务(资金实时同步) | 单点故障(领导者)导致全阻塞,容错性差 |
| Saga模式 | 链式事务,每个步骤独立提交,失败时补偿 | 最终一致性,异步,无阻塞 | 长事务,如订单-库存-支付(支付失败后库存补偿) | 补偿失败后超时重试,状态回滚,人工介入 |
| TCC模式 | 三阶段(Try-Confirm-Cancel),半强一致性 | 非阻塞,部分失败可补偿 | 需要部分确认的场景(如订单创建后,库存扣减(Try),支付确认(Confirm),失败则库存补偿(Cancel)) | Try失败后重试,Confirm失败回滚,Cancel失败人工干预 |
假设电商订单系统,用户下单后,订单服务、库存服务、支付服务需同步更新。需求:支付成功后库存必须扣减,否则超卖。方案设计Saga模式,步骤:
伪代码(Golang,关键点幂等性、超时重试):
// 库存服务:扣减库存(幂等+超时重试)
func DeductStock(ctx context.Context, orderID string, amount int) error {
if err := stockRepo.CheckStock(orderID); err != nil {
return fmt.Errorf("库存已处理: %v", err)
}
for i := 0; i < 3; i++ {
stock := Stock{OrderID: orderID, Amount: amount, Status: "待支付"}
if err := stockRepo.Save(stock); err != nil {
time.Sleep(time.Second * 2)
continue
}
return nil
}
return fmt.Errorf("库存扣减超时")
}
// 库存服务:补偿(幂等+超时重试)
func CompensateStock(ctx context.Context, orderID string) error {
if err := stockRepo.CheckCompensated(orderID); err != nil {
return fmt.Errorf("库存已补偿: %v", err)
}
for i := 0; i < 3; i++ {
stock := Stock{OrderID: orderID, Amount: 0, Status: "已恢复"}
if err := stockRepo.Update(stock); err != nil {
time.Sleep(time.Second * 2)
continue
}
return nil
}
return fmt.Errorf("库存补偿超时")
}
// 支付服务:支付(超时重试)
func Pay(ctx context.Context, orderID string) (bool, error) {
success := true // 实际可能失败
if success {
if err := stockRepo.Confirm(orderID); err != nil {
return false, err
}
} else {
if err := stockRepo.Compensate(orderID); err != nil {
return false, err
}
}
return success, nil
}
(约90秒)
“面对分布式数据一致性问题时,我会先明确业务场景,比如电商订单的库存扣减和支付流程。首先分析需求:如果用户支付成功后库存必须立即扣减,属于强一致性需求,但高并发下可能阻塞,所以选择Saga模式,通过链式事务和补偿机制保证最终一致性。具体步骤:需求分析拆解为订单、库存、支付三个服务,每个服务独立处理,失败时补偿;方案设计用Saga,每个步骤异步执行,支付成功后触发库存确认,失败则补偿。测试验证用单元测试模拟支付成功/失败,集成测试验证Saga流程,比如支付失败后库存是否恢复。迭代优化根据监控指标(如补偿调用次数、库存扣减延迟)调整,比如增加超时重试和幂等检查,避免循环补偿。极端故障场景下,若多个服务宕机,库存服务自动补偿并记录日志,人工介入恢复,确保系统稳定。”