【面试】分布式事务与分布式锁:核心原理与工程实践

1. 分布式事务:一致性难题的解决之道

在分布式系统中,事务的ACID特性难以直接满足。核心解决思路是通过柔性事务替代强一致性,具体方案包括:

1.1 两阶段提交(2PC)

  • 原理:协调者(Coordinator)主导,参与者(Participant)分阶段执行(Prepare & Commit/Rollback)。
  • 痛点:同步阻塞、协调者单点故障。
  • 适用场景:数据库层原生支持(如MySQL XA),但性能较差。

1.2 TCC(Try-Confirm-Cancel)

  • 原理:业务层补偿机制,分三阶段:
    • Try:预留资源(如冻结库存)。
    • Confirm:确认操作(如扣减库存)。
    • Cancel:回滚预留(如解冻库存)。
  • 优势:无资源阻塞,可自定义业务逻辑。
  • 案例:电商订单场景:
    // TCC接口示例
    public interface InventoryTccService {
        @Transactional
        boolean tryReserve(Long skuId, int count);
        
        @Transactional
        boolean confirmReserve(Long skuId, int count);
        
        @Transactional
        boolean cancelReserve(Long skuId, int count);
    }
    

1.3 基于消息的最终一致性

  • 原理:借助消息队列解耦事务步骤,如RocketMQ事务消息:
    1. 发送半消息(事务中)。
    2. 本地事务成功 → 提交消息。
    3. 消息消费端确保业务执行。
  • 公式:事务成功率 = 本地事务成功率 × 消息投递成功率。
  • 适用场景:支付结果通知、日志异步处理。

1.4 Saga模式

  • 原理:长事务拆分为多个子事务,每个子事务有对应的补偿操作。
  • 实现
    • 编排式(Choreography):服务间通过事件驱动。
    • 协同式(Orchestration):中心控制器调度。
  • 案例:机票预订系统:订票 → 支付 → 出票,任一失败触发反向补偿。

2. 分布式锁:协调分布式互斥访问

分布式锁需解决互斥性、容错性、死锁预防三大问题,常见方案对比:

2.1 Redis分布式锁

  • 实现SET key random_value NX PX 30000(Redisson封装)。
  • 隐患
    • 锁过期时间设置不当导致并发冲突(需续期机制)。
    • 主从切换可能丢锁(RedLock算法争议大)。
  • 最佳实践
    RLock lock = redisson.getLock("orderLock");
    try {
        lock.lock(30, TimeUnit.SECONDS); // 自动续期
        // 业务逻辑
    } finally {
        lock.unlock();
    }
    

2.2 ZooKeeper分布式锁

  • 原理:基于临时顺序节点(EPHEMERAL_SEQUENTIAL)和Watch机制。
  • 流程
    1. 创建临时有序节点。
    2. 判断是否为最小节点 → 获得锁。
    3. 若非最小,监听前序节点释放。
  • 优势:强一致性,无锁过期问题。
  • 缺陷:性能低于Redis,频繁Watch消耗资源。

2.3 etcd/Consul的分布式锁

  • 原理:基于租约(Lease)和键值对比(Compare-and-Swap)。
  • 特点:高可用、强一致,适合K8s环境集成。

3. 面试回答技巧:结合业务场景
  • 分布式事务选型

    • 强一致需求:优先考虑2PC(如银行核心系统)。
    • 高并发场景:TCC或消息队列(如秒杀库存扣减)。
    • 长事务:Saga模式(如跨境物流)。
  • 分布式锁选型

    • 简单场景:Redis锁(注意续期和集群模式)。
    • 强一致需求:ZooKeeper(如主选举)。
    • 云原生环境:etcd(如分布式任务调度)。

4. 避坑指南
  • 事务陷阱
    • TCC的空回滚(Try未执行但收到Cancel)和幂等问题(需唯一事务ID)。
    • 消息事务的消费端幂等设计(如数据库唯一索引)。
  • 锁陷阱
    • Redis锁的时钟漂移问题(避免多机房部署)。
    • ZK锁的惊群效应(顺序节点缓解)。

总结

回答此类问题时,需展现分层思考

  1. 原理层:理解CAP、BASE理论及算法本质。
  2. 实践层:熟悉至少两种技术的实现细节(如Redisson vs. Curator)。
  3. 架构层:根据业务场景(延迟容忍度、并发量)做技术选型。
  4. 踩坑经验:分享线上问题的诊断和解决过程(如锁失效导致资损)。

示例回答结尾

“在我上家公司,我们通过TCC+消息队列重构了支付系统。针对锁问题,曾因Redis未设置续期导致订单重复处理,最终引入Redisson的看门狗机制解决。核心是:没有银弹,只有适合场景的解决方案。


此回答框架既展示深度,又体现工程思维,可帮助候选人在面试中脱颖而出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小冷coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值