跳转至

消息处理策略

YesImBot 在处理用户消息时,可能会遇到在处理一条消息的过程中又收到新消息的情况。为了优雅地处理这种并发场景,系统提供了三种不同的处理策略。

策略概述

1. Skip 策略(默认)

配置值: "skip"

行为: 当系统正在处理一条消息时,如果收到新消息,直接跳过新消息,不做任何处理。

适用场景: - 对话频率较低的场景 - 希望保持简单的处理逻辑 - 不希望机器人"追赶"错过的消息

优点: - 逻辑简单,性能开销最小 - 避免消息堆积和延迟处理

缺点: - 可能错过重要消息 - 在活跃群聊中可能导致响应不及时

2. Immediate 策略

配置值: "immediate"

行为: 当前消息处理完成后,立即处理最新收到的消息(跳过中间的消息)。

适用场景: - 活跃的群聊环境 - 希望尽可能响应用户的最新消息 - 对实时性要求较高的场景

优点: - 保证最新消息得到处理 - 响应更加及时

缺点: - 可能导致连续的消息处理 - 在极端情况下可能形成处理链

3. Deferred 策略

配置值: "deferred"

行为: 记录被跳过的消息,等待一段"安静期"(没有新消息)后再处理。

适用场景: - 希望在对话暂停时处理错过的消息 - 平衡实时性和系统负载 - 群聊中有明显的对话间隔

优点: - 在合适的时机处理错过的消息 - 避免在活跃期间的频繁处理 - 更好的用户体验

缺点: - 处理延迟较大 - 逻辑相对复杂

配置方法

agentBehavior 配置中设置:

agentBehavior:
  newMessageStrategy: "skip"  # 或 "immediate" 或 "deferred"
  deferredProcessingTime: 10000  # 仅在 deferred 策略下有效,单位毫秒

配置参数说明

参数 类型 默认值 描述
newMessageStrategy string "skip" 新消息处理策略
deferredProcessingTime number 10000 延迟策略的安静期时间(毫秒)

实现细节

防抖机制

系统使用防抖机制来避免频繁的消息处理:

  • 每个频道都有独立的防抖定时器
  • 默认防抖时间为 1000ms(可在 arousal.debounceMs 中配置)
  • 在防抖期间收到的消息会被合并处理

并发控制

  • 每个频道同时只能有一个消息处理任务
  • 使用频道级别的锁来防止并发处理
  • 处理完成后会检查是否有待处理的消息

状态管理

系统维护以下状态来支持不同的处理策略:

  • busyChannels: 正在处理消息的频道集合
  • skippedSegments: 被跳过的消息段落记录
  • deferredTimers: 延迟处理的定时器映射

最佳实践建议

选择策略的考虑因素

  1. 群聊活跃度
  2. 低活跃度:推荐 skip 策略
  3. 中等活跃度:推荐 deferred 策略
  4. 高活跃度:推荐 immediate 策略

  5. 响应实时性要求

  6. 高实时性:选择 immediate 策略
  7. 中等实时性:选择 deferred 策略
  8. 低实时性:选择 skip 策略

  9. 系统资源考虑

  10. 资源充足:可选择 immediatedeferred
  11. 资源有限:推荐 skip 策略

配置建议

# 适合大多数场景的配置
agentBehavior:
  newMessageStrategy: "deferred"
  deferredProcessingTime: 15000  # 15秒安静期
  arousal:
    debounceMs: 2000  # 2秒防抖

监控和调试

可以通过日志来监控消息处理策略的效果:

  • 查看 [AgentCore] 标签的日志
  • 关注 "频道正忙" 和 "策略" 相关的日志信息
  • 启用 debug 模式获取更详细的处理信息
system:
  debug:
    enable: true  # 启用调试模式