引言

传统的Agent架构是请求-响应式的:用户发请求,Agent处理后返回响应。这种模式简单直观,但在复杂的多Agent协作、实时响应和大规模并发场景中显得力不从心。

事件驱动架构(EDA)为Agent系统带来了新的设计范式。Agent不再被动等待请求,而是主动响应系统中发生的事件。这种模式更接近人类的工作方式——我们不是一直在等别人问问题,而是根据周围发生的事件做出反应。

一、为什么Agent需要事件驱动

1.1 解耦

请求-响应模式下,调用者必须知道被调用者的地址和能力。事件驱动模式下,事件发布者不需要知道谁会处理这个事件——它只管发布,订阅者自行处理。

1.2 异步

Agent的操作往往耗时较长(LLM推理、工具调用)。同步等待会阻塞整个系统。事件驱动天然支持异步处理,提高系统吞吐量。

1.3 可扩展

新功能可以通过添加新的事件订阅者实现,不需要修改现有Agent。例如,想要在Agent完成分析后自动发送通知,只需添加一个订阅"analysis_complete"事件的通知Agent。

1.4 实时响应

在需要实时响应的场景中(如监控告警、用户交互),事件驱动比轮询更高效、更及时。

二、事件驱动Agent架构

2.1 核心组件

┌─────────────────────────────────────────┐
│              事件总线                     │
│         (Event Bus / Message Queue)      │
└──────┬──────────┬──────────┬────────────┘
       │          │          │
  ┌────▼───┐ ┌───▼────┐ ┌───▼────┐
  │ Agent A │ │ Agent B │ │ Agent C │
  │Publisher│ │Subscriber│ │Sub.+Pub│
  └────────┘ └────────┘ └────────┘

事件总线:负责事件的传递。2026年的主流选择包括Kafka、NATS、Redis Streams和Pulsar。

事件发布者:产生事件的Agent。例如,数据分析Agent完成分析后发布"analysis_complete"事件。

事件订阅者:监听并处理事件的Agent。例如,通知Agent订阅"analysis_complete"事件,收到后发送通知。

混合角色:Agent可以同时是发布者和订阅者。

2.2 事件设计

一个良好的事件结构应该包含:

{
  "event_id": "evt-uuid-001",
  "event_type": "task.completed",
  "source": "data-analyst-agent-01",
  "timestamp": "2026-07-01T10:00:00.123Z",
  "version": "1.2",
  "correlation_id": "task-uuid-001",
  "payload": {
    "task_id": "task-uuid-001",
    "result": {...},
    "metrics": {
      "duration_ms": 15000,
      "tokens_used": 5000
    }
  },
  "metadata": {
    "environment": "production",
    "priority": "normal"
  }
}

2.3 事件类型分类

领域事件:业务逻辑相关的事件。如"订单已创建"、“分析已完成”。

生命周期事件:Agent生命周期相关的事件。如"agent_started"、“agent_stopped”、“agent_error”。

系统事件:系统级别的事件。如"resource_threshold_exceeded"、“config_changed”。

集成事件:与外部系统交互产生的事件。如"api_rate_limit_hit"、“external_data_received”。

三、事件处理模式

3.1 简单处理

一个事件由一个Agent处理:

Event: "new_email_received" → Agent: EmailProcessor

3.2 扇出处理

一个事件被多个Agent同时处理:

Event: "new_order_created"
  → Agent: InventoryUpdater (更新库存)
  → Agent: NotificationSender (发送通知)
  → Agent: AnalyticsRecorder (记录分析数据)

3.3 链式处理

事件触发一系列处理链:

Event: "user_feedback_received"
  → Agent: FeedbackClassifier (分类反馈)
  → Event: "feedback.classified"
    → Agent: ResponseGenerator (生成回复)
    → Event: "response.generated"
      → Agent: ResponseSender (发送回复)

3.4 聚合处理

多个事件聚合后触发处理:

Event: "sensor_a_reading" ──┐
Event: "sensor_b_reading" ──┤→ Agent: DataAggregator (聚合分析)
Event: "sensor_c_reading" ──┘

需要定义聚合条件:时间窗口(如5秒内)、数量阈值(如3个事件)或组合条件。

3.5 补偿处理

当某个事件处理失败时,发布补偿事件触发回滚操作:

Event: "payment_failed" → Agent: CompensationHandler → Event: "order_cancelled"

四、Agent事件处理设计

4.1 事件处理器

每个Agent内部需要一个事件处理器框架:

class EventDrivenAgent:
    def __init__(self):
        self.handlers = {}
    
    def on(self, event_type, handler):
        """注册事件处理器"""
        self.handlers[event_type] = handler
    
    async def handle_event(self, event):
        """处理传入的事件"""
        handler = self.handlers.get(event["event_type"])
        if handler:
            result = await handler(event)
            # 处理结果可能产生新事件
            if result and result.get("events_to_publish"):
                for evt in result["events_to_publish"]:
                    await self.event_bus.publish(evt)
        else:
            # 无处理器,记录告警
            logger.warning(f"No handler for event type: {event['event_type']}")

4.2 状态管理

事件驱动Agent通常是有状态的——它需要记住之前处理过的事件以便处理后续事件:

class StatefulAgent(EventDrivenAgent):
    def __init__(self):
        super().__init__()
        self.state = {}
    
    async def handle_event(self, event):
        # 根据当前状态和事件决定处理方式
        state_key = event.get("correlation_id")
        current_state = self.state.get(state_key, "initial")
        
        handler = self.state_handlers.get((current_state, event["event_type"]))
        if handler:
            new_state, result = await handler(event, current_state)
            self.state[state_key] = new_state
            return result

4.3 背压处理

当事件产生速度超过Agent处理速度时,需要背压机制:

  • 缓冲:将未处理的事件放入队列
  • 丢弃:对低优先级事件直接丢弃
  • 节流:通知上游减速
  • 扩容:启动更多Agent实例

五、事件溯源

事件溯源(Event Sourcing)是一种将所有状态变更记录为事件的模式。Agent的当前状态可以通过重放事件历史来重建。

5.1 优势

  • 完整审计:所有变更都有记录
  • 时间旅行:可以回到任意历史时间点的状态
  • 调试:出问题时可以重放事件复现
  • 分析:可以分析事件模式优化系统

5.2 实现要点

class EventSourcedAgent:
    def __init__(self, event_store):
        self.event_store = event_store
        self.state = self._replay_events()
    
    def _replay_events(self):
        """重放所有事件重建状态"""
        state = initial_state()
        for event in self.event_store.get_events():
            state = self._apply_event(state, event)
        return state
    
    def execute_action(self, action):
        """执行操作,生成事件"""
        # 先验证操作是否合法
        if not self._can_execute(action, self.state):
            raise InvalidActionError()
        
        # 生成事件
        event = self._create_event(action)
        
        # 应用事件到状态
        self.state = self._apply_event(self.state, event)
        
        # 持久化事件
        self.event_store.append(event)
        
        # 发布事件
        self.event_bus.publish(event)

5.3 快照优化

事件历史过长时,重放成本很高。定期保存状态快照,恢复时从最近的快照开始:

Snapshot at T10: state = {...}
Events: T11, T12, T13, T14, T15
恢复: 加载快照T10 → 重放T11-T15

六、生产实践

6.1 事件Schema管理

事件结构需要演进。建议:

  • 使用Schema Registry管理事件版本
  • 新版本向后兼容旧版本
  • 提供Schema迁移工具

6.2 死信队列

处理失败的事件进入死信队列(DLQ),供后续分析和重处理:

正常事件 → Agent处理 → 成功
              ↓ 失败
        重试 (最多3次)
              ↓ 仍然失败
         死信队列 → 人工分析

6.3 幂等性保证

同一事件可能被投递多次。处理逻辑必须幂等:

async def handle_event(self, event):
    event_id = event["event_id"]
    if self.processed_events.contains(event_id):
        return  # 已处理过,跳过
    # 处理事件
    self.processed_events.add(event_id)

6.4 监控

  • 事件延迟:从事件产生到被处理的延迟
  • 处理失败率:事件处理失败的比例
  • 队列积压:待处理事件的数量
  • 事件吞吐:每秒处理的事件数

结语

事件驱动架构为Agent系统带来了松耦合、高扩展和实时响应的能力。但它也带来了复杂性——调试困难、事件链路追踪困难、一致性问题。

2026年的实践表明,事件驱动并不适合所有Agent系统。对于简单的请求-响应场景,传统的同步模式更简单有效。但对于需要多Agent协作、实时响应和高度可扩展的系统,事件驱动是正确的选择。

未来的方向是"智能事件路由"——Agent本身具备事件路由能力,能够根据事件内容和当前系统状态智能决定事件应该流向哪里。这将使事件驱动架构更加灵活和高效。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。