事件驱动架构

经典架构模式

以事件的发布、传递与处理来组织系统,组件之间松耦合、异步协作。

结构示意
flowchart LR
      P[订单服务] -->|OrderPaid| B[事件总线]
      B --> C1[通知服务]
      B --> C2[积分服务]
      B --> C3[仓储服务]
知识说明
事件驱动架构(EDA)中,生产者发出领域事件(如 OrderPaid),消费者各自响应(发货、积分、短信)。中间常有消息总线/队列。这与观察者模式同族,但分布在进程之间时要处理重复消费、顺序与最终一致性。 适合实时通知、微服务解耦、IoT。代价是流程不再是一条同步调用链,排障要靠追踪与日志。
特点
  • 异步
  • 发布/订阅
  • 松耦合
  • 可扩展消费者
优点
  • 服务不必同步等待
  • 容易加新消费者
  • 峰值可用队列削峰
局限
  • 调试复杂
  • 一致性变为最终一致
  • 需要幂等与重试设计
适用
微服务集成 实时监控 IoT 交易通知
例子展示 —— 支付成功后的通知与积分
问题

支付服务里直接调短信、邮件、积分,每加一个下游都要改支付核心,还会被下游拖慢。

做法

支付成功只发布 OrderPaid。通知与积分订阅该事件。支付主链路变短,新下游只需订阅。

sequenceDiagram
        participant Pay as 支付服务
        participant Bus as 总线
        participant N as 通知
        Pay->>Bus: OrderPaid
        Bus->>N: 异步投递
class OrderPaid { String orderId; }
interface EventBus { void publish(Object e); void subscribe(Class<?> t, Consumer<Object> h); }
class PayService {
    private final EventBus bus;
    void onPaid(String orderId) { bus.publish(new OrderPaid(orderId)); }
}
class NotifyHandler implements Consumer<Object> {
    public void accept(Object e) { /* 发短信 */ }
}
def on_paid(order_id, bus):
    bus.publish("OrderPaid", {"order_id": order_id})
def notify(event):
    send_sms(event["order_id"])
bus.subscribe("OrderPaid", notify)