Decision Guide:REST vs Event-Driven(REST vs 事件驱动)
知识库位置:
FDE Knowledge Base/03 Engineering/Decision Guides/REST-vs-Event-Driven.mdDecision Guide 使用方式见 README(使用说明)。
这两种方式解决的是不同的系统协作问题。
REST 更适合
Section titled “REST 更适合”REST(Representational State Transfer,表述性状态转移)风格下,调用方需要:
立即得到明确结果。
典型模式:
Service A(服务 A)↓HTTP Request(HTTP 请求)↓Service B(服务 B)↓Response(响应)适合:
- 查询客户信息
- 查询订单状态
- 创建工单
- 执行同步业务操作
Event-Driven 更适合
Section titled “Event-Driven 更适合”Event-Driven(事件驱动)方式下,系统只需要表达:
某件事情发生了。
例如:
OrderCreated(订单已创建)PaymentCompleted(支付已完成)CustomerUpdated(客户已更新)然后让多个系统自行处理。
Producer(生产者)↓Event Bus(事件总线)├─ Consumer A(消费者 A)├─ Consumer B(消费者 B)└─ Consumer C(消费者 C)Decision Questions(决策问题)
Section titled “Decision Questions(决策问题)”依次问:
- 调用者是否需要立即得到结果?
- 是否有多个消费者?
- 是否需要解耦生产者和消费者?
- 是否允许最终一致性(Eventual Consistency,最终一致性)?
- 是否需要异步处理?
- 团队是否有能力维护消息系统?
Prefer REST When(倾向 REST 的场景)
Section titled “Prefer REST When(倾向 REST 的场景)”- 简单点对点调用
- 强同步语义
- 用户正在等待结果
- 业务流程简单
- Integration(集成)数量有限
Prefer Event-Driven When(倾向事件驱动的场景)
Section titled “Prefer Event-Driven When(倾向事件驱动的场景)”- 一个事件需要触发多个下游系统
- 下游处理耗时较长
- 系统之间需要降低耦合
- 有明显异步工作流
- 事件本身具有业务意义
Warning Signs(警告信号)
Section titled “Warning Signs(警告信号)”不要因为:
「微服务都应该上 Kafka(分布式事件流平台)」
而采用 Event-driven。
Event-driven 会引入:
- Duplicate Event(重复事件)
- Ordering(事件顺序)
- Retry(重试)
- Dead Letter Queue(死信队列)
- Eventual Consistency(最终一致性)
- Debugging Complexity(调试复杂度)
Rule of Thumb(经验法则)
Section titled “Rule of Thumb(经验法则)”Need immediate answer?(需要立即得到答案)→ REST
Need to announce something happened?(需要广播某事已发生)→ Event(事件)
Need both?(两者都需要)→ REST + Event