跳转到内容

Decision Guide:REST vs Event-Driven(REST vs 事件驱动)

知识库位置:FDE Knowledge Base/03 Engineering/Decision Guides/REST-vs-Event-Driven.md Decision Guide 使用方式见 README(使用说明)。

这两种方式解决的是不同的系统协作问题。

REST(Representational State Transfer,表述性状态转移)风格下,调用方需要:

立即得到明确结果。

典型模式:

Service A(服务 A)
↓
HTTP Request(HTTP 请求)
↓
Service B(服务 B)
↓
Response(响应)

适合:

  • 查询客户信息
  • 查询订单状态
  • 创建工单
  • 执行同步业务操作

Event-Driven(事件驱动)方式下,系统只需要表达:

某件事情发生了。

例如:

OrderCreated(订单已创建)
PaymentCompleted(支付已完成)
CustomerUpdated(客户已更新)

然后让多个系统自行处理。

Producer(生产者)
↓
Event Bus(事件总线)
├─ Consumer A(消费者 A)
├─ Consumer B(消费者 B)
└─ Consumer C(消费者 C)

依次问:

  1. 调用者是否需要立即得到结果?
  2. 是否有多个消费者?
  3. 是否需要解耦生产者和消费者?
  4. 是否允许最终一致性(Eventual Consistency,最终一致性)?
  5. 是否需要异步处理?
  6. 团队是否有能力维护消息系统?

Prefer REST When(倾向 REST 的场景)

Section titled “Prefer REST When(倾向 REST 的场景)”
  • 简单点对点调用
  • 强同步语义
  • 用户正在等待结果
  • 业务流程简单
  • Integration(集成)数量有限

Prefer Event-Driven When(倾向事件驱动的场景)

Section titled “Prefer Event-Driven When(倾向事件驱动的场景)”
  • 一个事件需要触发多个下游系统
  • 下游处理耗时较长
  • 系统之间需要降低耦合
  • 有明显异步工作流
  • 事件本身具有业务意义

不要因为:

「微服务都应该上 Kafka(分布式事件流平台)」

而采用 Event-driven。

Event-driven 会引入:

  • Duplicate Event(重复事件)
  • Ordering(事件顺序)
  • Retry(重试)
  • Dead Letter Queue(死信队列)
  • Eventual Consistency(最终一致性)
  • Debugging Complexity(调试复杂度)
Need immediate answer?(需要立即得到答案)
→ REST
Need to announce something happened?(需要广播某事已发生)
→ Event(事件)
Need both?(两者都需要)
→ REST + Event