综合练习
订单-库存 Kafka 事件流设计。
40 分钟
综合练习
把本 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 足够。