事件驱动架构
经典架构模式
以事件的发布、传递与处理来组织系统,组件之间松耦合、异步协作。
结构示意
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)