Java 精通 01:分布式一致性、事务模式与幂等——从理论到可交付方案
面向资深/专家:CAP 的实践读法、BASE、2PC/Saga/TCC 的取舍、Outbox 与消息语义;Java 业务里如何实现幂等与补偿的可观测闭环。
- Java
- 分布式
- 一致性
- 架构
本篇目标:能把 CAP 讲成工程取舍;能为订单类业务画状态机;能设计幂等键与去重表;能口述 Outbox 解决的原子性问题;知道至少一次投递下为何必须幂等。
1. 知识点:CAP 的工程读法#
分区发生时:一致性 vs 可用性拉扯。多数互联网业务选择「最终一致 + 可观测补偿」,而不是强行线性一致一切读。
2. 知识点:订单状态机(示例)#
| 状态 | 允许事件 | 下一状态 |
|---|---|---|
| CREATED | PAY | PAID |
| PAID | SHIP | SHIPPED |
| SHIPPED | CONFIRM | DONE |
非法迁移返回业务错误码;状态迁移与幂等键同事务写入。
3. 知识点:幂等表(示意 DDL)#
CREATE TABLE idempotency (
biz_key VARCHAR(64) PRIMARY KEY,
response TEXT NOT NULL,
created_at TIMESTAMP NOT NULL
);处理流程:INSERT 幂等键冲突 → 直接返回历史响应;成功则写入响应 JSON。
并发:PRIMARY KEY + 捕获 duplicate key,或用 DB 事务隔离。
4. 知识点:Saga#
长事务拆本地事务 + 补偿:每笔本地事务可提交,失败执行逆操作。要点:补偿也要幂等;状态机记录当前步骤。
5. 知识点:Outbox#
问题:写库成功、发消息失败 → 不一致。
做法:业务事务内写 outbox 表;异步线程扫描 published=false 投递 MQ;成功后标记。
CREATE TABLE outbox (
id BIGSERIAL PRIMARY KEY,
payload JSONB NOT NULL,
published BOOLEAN NOT NULL DEFAULT FALSE,
created_at TIMESTAMP NOT NULL
);6. 知识点:消息语义#
| 语义 | 含义 | 消费者 |
|---|---|---|
| at-most-once | 可能丢 | 简单 |
| at-least-once | 可能重复 | 必须幂等 |
| exactly-once | 端到端代价高 | 事务消息或幂等 + 去重 |
7. Lab#
画出「下单→扣库存→支付回调」三状态机;写出幂等键命名规范(bizType + bizId + operation);伪代码 Outbox 发布器循环。
8. 自测清单#
- Outbox 相对「先发消息后写库」解决什么?
- Saga 补偿失败怎么办?
- 为何不能用 wall clock 做全局顺序?
- at-least-once + 非幂等 Consumer 会怎样?
相关阅读
基于内容相似度 + 标签/系列加权
- 1 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 精通 03:架构演进、模块化单体与领域建模(专家级的边界与治理)
微服务不是默认答案:模块化单体、限界上下文、聚合与领域事件、API 版本化与契约测试;多团队协作下的架构治理与演进策略。
- Java
- 架构
- DDD
- 1 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 进阶 03:Spring 生态与典型服务端架构(IoC、AOP、事务与集成)
Spring Boot 心智:依赖注入与 Bean 生命周期、AOP 的典型用途、声明式事务传播与失效场景;与 Web、持久化、缓存、消息的常见集成边界。
- Java
- Spring
- 架构
- 2 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 进阶 01:JUC、线程池、CompletableFuture 与异步组合实战
写给高级工程师:happens-before 直觉、Lock 与原子类、ExecutorService 参数含义、超时/取消/组合异步;常见踩坑与背压入门。
- Java
- 并发
- JUC
- 1 分钟Java 从基础到精通(初级 · 高级 · 专家路线)
Java 精通 02:性能剖析、容量规划与可观测性(指标 · 日志 · 链路)
专家必备:从基准测试误区到火焰图/JFR、线程与分配剖析;RED/USE 类指标、结构化日志、分布式追踪与 SLO;压测如何服务于容量决策。
- Java
- 性能
- 可观测性