因为…所以… — 从CAP到分布式事务的完整因果推导
CAP定理:因为网络分区(P)不可避免,所以一致性和可用性只能二选一:
BASE理论:因为CAP只能二选一,大多数业务选AP → 所以接受基本可用+软状态+最终一致性
| 方案 | 一致性 | 性能 | 侵入性 | 因为…所以选它 |
|---|---|---|---|---|
| 2PC | 强一致 | 低(阻塞) | 无 | 因为要强一致 → 但性能差,少用 |
| TCC | 强一致 | 高 | 大(3个方法) | 因为要强一致+高性能 → 但要写Try/Confirm/Cancel |
| Saga | 最终一致 | 高 | 中(补偿) | 因为长事务 → 所以编排+补偿 |
| Seata AT | 最终一致 | 高 | 无(自动) | 因为不想改代码 → 所以AT自动生成回滚日志 |
| 本地消息表 | 最终一致 | 高 | 小 | 因为简单可靠 → 所以最常用 |
synchronized只能锁同一JVM内的线程,A服务和B服务在不同JVM → 锁不住!
Redis vs ZooKeeper 分布式锁
| Redis | ZooKeeper | |
|---|---|---|
| 性能 | 高(内存) | 较低(磁盘) |
| 可靠性 | 主从切换可能丢锁 | ZAB协议保证一致 |
| 续期 | Watchdog自动续 | 临时节点+Session |
| 因为…所以选 | 因为性能优先 → Redis | 因为可靠性优先 → ZK |
DB1的orders表id=1,2,3... DB2的orders表也是id=1,2,3... → 合并查询时ID冲突!
| 面试题 | 因为…所以… |
|---|---|
| CAP定理 | 因为网络分区不可避免 → 所以C和A只能二选一 |
| BASE理论 | 因为大多数业务选AP → 所以接受基本可用+最终一致性 |
| 分布式事务方案 | 因为跨库事务本地管不了 → 所以2PC/TCC/Saga/Seata |
| 2PC vs TCC vs Saga | 因为2PC阻塞 → 所以TCC非阻塞但代码侵入 → Saga长事务编排 |
| 分布式锁 | 因为synchronized跨JVM无效 → 所以用Redis NX/ZK临时节点 |
| Redisson看门狗 | 因为锁过期但业务没完 → 所以Watchdog自动续期 |
| 雪花算法 | 因为分库自增ID重复+UUID无序 → 所以雪花(时间戳+机器ID+序列号) |
| 时钟回拨 | 因为雪花依赖时间戳 → 所以时钟回拨会生成重复ID → 号段模式兜底 |