大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
综合练习
把本 track 模式串成 订单-库存 场景:用户下单、扣库存、通知、读模型更新。技术栈对照 kafka-spring、sc-feign、ip-saga。
学习目标
- 设计端到端事件流与同步边界
- 标注熔断、幂等、Outbox 插入点
- 能向团队讲解架构权衡
业务需求
- 用户下单 → 必须立刻 知道是否成功(库存不足则失败)
- 成功后:发邮件、更新「我的订单」列表、写入搜索/统计
- 库存服务偶发慢,不能拖垮订单 API
推荐架构
┌──────────┐ POST /orders ┌─────────────┐ Feign+熔断 ┌────────────────┐
│ Web/App │ ──────────────► │ order-svc │ ────────────► │ inventory-svc │
└──────────┘ │ + Outbox │ └────────────────┘
└──────┬──────┘
│ OrderCreated (Kafka)
┌───────────────┼───────────────┐
▼ ▼ ▼
[notify-svc] [read-model] [analytics]
RabbitMQ 可选 MySQL 投影 Kafka 消费
- 同步:order → inventory 预留库存(ip-circuit fallback:库存服务不可用 → 503 + 重试提示)
- 异步:OrderCreated → 通知(rmq-spring 任务队列亦可)、读模型(ip-cqrs)
- Outbox:ip-event-driven 保证落库与发消息一致
失败路径(Saga 轻量版)
reserve 失败 → 订单标记 FAILED,不发 OrderCreated
reserve 成功、发消息失败 → Outbox Relay 重试
notify 重复消费 → messageId 去重([ip-idempotency](/tracks/integration-patterns-essentials/lessons/ip-idempotency))
不必上中心 Orchestrator;协同式事件 + 补偿 ReleaseInventory 即可 lab 规模。
BFF 层(可选)
GET /pages/orders ── Mobile BFF ── 只读 order_list_view(CQRS 投影)
└── 不调 4 个微服务([ip-bff](/tracks/integration-patterns-essentials/lessons/ip-bff))
Admin 复杂筛选可考虑 GraphQL(gql-spring);公开端 REST 足够。
Lab 任务清单
- 定义 OrderCreated Avro/JSON schema 与 topic 名
- 实现 inventory Feign + Resilience4j(对照 sc-circuit-breaker)
- Consumer 用 processed_events 表做幂等
- 用 kafka-monitor 看 lag
评审问题(自测)
- 为何扣库存不用纯 Kafka 异步?
- 若 inventory 与 order 合并部署,哪些模式可删掉?(ip-anti)
小结
同步保关键路径;Kafka 广播副作用;Outbox+幂等+熔断兜底。 本 track 完结——按需深入 Kafka、RabbitMQ、Spring Cloud 动手实验。