---
name: event-driven
when: '事件驱动, 事件溯源, 领域事件, 消息队列, MQ, 异步消息, 解耦, 事件发布, Event Sourcing, CQRS, 最终一致性'
scope:
  - backend
products:
  - '*'
id: ka-pattern-event-driven
asset_kind: pattern
lifecycle_status: active
owner_mechanism_id: mc-backend-pattern
authority: supporting
routes:
  - '*'
primary_triggers:
  - 事件驱动
  - 事件溯源
  - 领域事件
  - 消息队列
  - MQ
  - 异步消息
  - 解耦
  - 事件发布
  - Event Sourcing
  - CQRS
  - 最终一致性
priority: P2
specificity: 3
version: 1.1.0
last_reviewed: '2026-06-01'
consumes: []
emits: []
secondary_triggers: []
negative_triggers: []
type: pattern
stages: ["联调验证"]
---

## 决策规则
- 跨模块非强一致性交互优先使用事件驱动（MQ），未使用时必须文档化原因
- 事件必须幂等消费：消费者必须能安全处理重复消息（唯一约束/去重表/幂等键）
- 事件消费失败必须有重试机制（建议 3 次）+ 死信队列（DLQ），禁止静默丢弃
- 事件结构必须包含：事件类型、事件 ID（幂等键）、发生时间、聚合 ID、事件载荷
- 禁止通过事件传递大对象（如完整订单），事件载荷只传 ID + 关键变更字段
- 事件消费者异常不影响事件生产者（异步解耦），生产者不依赖消费者响应
- 最终一致性场景必须定义：最大延迟容忍、补偿策略、对账机制
- 禁止用消息队列做 RPC（同步等待响应），同步调用走 HTTP/Feign/gRPC
- 事件消费者必须实现幂等处理，同一事件重复消费不能产生副作用
- 事件必须包含版本号和发生时间，便于消费者兼容演进
- 事件消费失败必须有重试机制（退避策略）和死信队列兜底
- 关键业务事件必须持久化存储，不能只发 MQ 不落库
- 事件体禁止包含大对象（如完整订单），应只传 ID 引用

## 验收项
- [AC-01] 跨模块交互使用事件驱动或有文档化原因
- [AC-02] 事件消费幂等
- [AC-03] 消费失败有重试 + 死信队列
- [AC-04] 事件结构包含类型/ID/时间/载荷
- [AC-05] 最终一致性有补偿和对账机制
- [AC-06] 消费者幂等处理
- [AC-07] 失败有重试和死信队列
- [AC-08] 关键事件持久化
