Skip to content

事件驱动 + 请求-响应混合架构 ​

解决什么问题:纯事件驱动无法满足所有需求—— 混合架构让事件(异步)+ 请求-响应(同步)各司其职。

业务问题 ​

真实场景 ​

场景 1:电商 API 的混合需求

需求:
  - 用户实时查询订单状态(同步)
  - 后台异步处理订单事件(异步)
  - 第三方支付回调(同步)
  - 内部库存扣减(异步)
  
纯事件驱动的问题:
  - Web 用户查询需要同步响应
  - 第三方支付回调是 HTTP
  
纯同步的问题:
  - 库存扣减要广播给多个下游
  - 故障级联

Bellemare Ch 13 原话:

"As powerful as event-driven microservice patterns are, they cannot serve all of the business needs of an organization. Request-response endpoints provide the means to serve important data in real time."

失败模式 ​

失败模式后果
纯事件Web/API 无法同步响应
纯同步故障级联、性能差
混合无纪律行为不一致

控制论视角 ​

Ch 4 §4.6:"反馈环路" + Ch 15:"测量环节"

同步 = 直接反馈环(短链路、实时)
异步 = 事件流反馈环(长链路、解耦)

混合架构 = 多种反馈环并存
  - 同步环:用于需要实时响应的场景
  - 异步环:用于需要解耦的场景
  - 二者通过事件流衔接

对位:

  • 同步 API = 测量环节(直接读取状态)
  • 异步事件 = 控制律输出(处理后的事件)
  • API Gateway = 中央控制器(路由)

核心概念 ​

何时用同步 vs 异步 ​

场景推荐原因
用户实时查询同步延迟要求
第三方 API 回调同步HTTP 协议
跨服务事务异步解耦
状态广播异步多下游
IoT 数据上报异步高并发
管理操作同步状态确认

3 种混合模式 ​

模式 1:事件驱动 + 同步入口
  外部请求 → 微服务(处理)→ 同步响应
              ↓ 副作用
            内部事件流
  
  例:下单 API
    POST /orders → 创建订单 → 201 Created
                  → 发 OrderCreated 事件
    
模式 2:同步查询 + 事件更新(读写分离)
  查询请求 → REST API(读物化状态)
  写入事件 → 事件流 → 更新物化状态
  
  例:订单状态查询
    GET /orders/123 → 读本地物化状态(快)
    
模式 3:API Gateway
  客户端 → API Gateway → 微服务
                    ↓
                  事件流(内部)
  
  例:移动 App
    App → API Gateway → OrderService / InventoryService
                     ↓
                   Event Bus

实时状态服务(同步 + 异步) ​

场景:Web 用户实时查询订单状态

方案:
  - 订单事件流 → 物化到本地状态 → REST API
  - 写:发事件(异步)
  - 读:从本地状态读(同步)
  - 优点:读写都最优

外部 API 调用模式 ​

陷阱:
  - 网络不稳定 → 重试 + 超时
  - 响应格式变化 → schema 适配
  - 速率限制 → 退避策略
  
处理:
  - 异步化(队列 + worker)
  - 缓存响应
  - Circuit Breaker(熔断器)

工程实践 ​

实战 1:电商下单 API(混合) ​

python
class OrderAPI:
    def place_order(self, request):
        # 同步部分:接收请求
        order = Order.create(request)
        
        # 同步部分:业务校验(快)
        if not self.validate(order):
            return 400, "Invalid"
        
        # 异步部分:发事件(不等待)
        self.event_bus.publish(OrderCreated(order))
        
        # 同步响应(立即返回)
        return 201, order.id
    
    def get_order_status(self, order_id):
        # 同步查询(读物化状态)
        return self.materialized_state.get(order_id)

实战 2:避免级联故障 ​

策略:
  - Circuit Breaker:失败率超阈值,断路
  - 超时:每个调用有上限
  - 重试:仅对瞬时错误
  - 降级:失败时返回默认值
  
工具:
  - Resilience4j
  - Hystrix(已停止维护)
  - Istio(service mesh)

实战 3:API Gateway 设计 ​

功能:
  - 路由(按路径/header)
  - 鉴权(统一)
  - 限流(统一)
  - 监控(统一)
  - 协议转换(HTTP → gRPC)
  
工具:
  - Kong
  - Ambassador
  - Spring Cloud Gateway

反模式 vs 正模式 ​

反模式正模式
同步链路过长同步只做必要环节
异步查询(轮询)同步查询 + 异步更新
无超时每次调用都有超时
同步调用外部 API异步化 + Circuit Breaker

性能指标 ​

指标衡量健康值
同步 API p9999% 请求延迟< 200ms
同步/异步比例不同调用类型比例业务决定
Circuit Breaker 触发断路次数低
API Gateway 路由延迟网关增加延迟< 10ms

边界判断 ​

何时用同步(必须) ​

  • 用户实时查询
  • 第三方 HTTP 回调
  • 管理操作
  • 需要立即确认

何时用异步(必须) ​

  • 跨服务事务
  • 状态广播
  • 高并发写入
  • 不需要立即响应

何时用 API Gateway(推荐) ​

  • 多客户端类型
  • 多协议支持
  • 统一鉴权/限流

关键洞察 ​

  1. 同步和异步不是对立——是不同反馈环路,各有适用场景。
  2. API Gateway 是混合架构的关键——它路由不同调用方式。
  3. 物化状态让读写都最优——同步读状态,异步写事件。
  4. 外部 API 必须 Circuit Breaker——不可控依赖是故障主因。
  5. 与 cybernetics 同构——同步 = 直接反馈(Ch 4 §4.6),异步 = 事件流反馈(Ch 15 测量累积)。

从名家方法论与工程化思路中蒸馏出自己的工程体系。