消息处理策略
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
: 延迟处理的定时器映射
最佳实践建议
选择策略的考虑因素
- 群聊活跃度
- 低活跃度:推荐
skip
策略 - 中等活跃度:推荐
deferred
策略 -
高活跃度:推荐
immediate
策略 -
响应实时性要求
- 高实时性:选择
immediate
策略 - 中等实时性:选择
deferred
策略 -
低实时性:选择
skip
策略 -
系统资源考虑
- 资源充足:可选择
immediate
或deferred
- 资源有限:推荐
skip
策略
配置建议
# 适合大多数场景的配置
agentBehavior:
newMessageStrategy: "deferred"
deferredProcessingTime: 15000 # 15秒安静期
arousal:
debounceMs: 2000 # 2秒防抖
监控和调试
可以通过日志来监控消息处理策略的效果:
- 查看
[AgentCore]
标签的日志 - 关注 "频道正忙" 和 "策略" 相关的日志信息
- 启用 debug 模式获取更详细的处理信息