PicoBot/ARCHITECTURE_REVIEW.md
xiaoxixi dfe0fad61e 重构: 统一消息总线与通道管理,消除重复引用
- OutboundDispatcher 改用 ChannelManager 获取通道,不再维护独立注册表
- CliChatChannel 通过控制消息通道操作 SessionStore,移除独立引用
- MessageBus 统一通过 ChannelManager 创建,避免重复实例
- GatewayState 移除冗余字段,统一通过 ChannelManager 访问
- 新增 ControlInbound/ControlOutbound/ControlMessage 类型支持会话管理操作
- 添加 ARCHITECTURE_REVIEW.md 记录架构问题与修复状态
2026-04-26 17:09:52 +08:00

3.2 KiB
Raw Blame History

架构审查报告

生成时间: 2026-04-26 更新时间: 2026-04-26

审查摘要

本报告识别了当前代码库中的架构不合理、冗余和无效代码的问题。


问题清单

已修复

#1 OutboundDispatcher 重复维护 Channel 注册表

修复方案: OutboundDispatcher 现在从 ChannelManager 获取 channels而不是自己维护一份注册表。

修改文件:

  • src/bus/dispatcher.rs - 移除 channels 字段,改用 ChannelManager
  • src/channels/manager.rs - 添加 register_channel 方法
  • src/gateway/mod.rs - 简化 dispatcher 初始化

#2 CliChatChannel 持有独立的 SessionStore

修复方案: CliChatChannelSessionStore 通过依赖注入从 ChannelManager 获取,而不是独立持有。

修改文件:

  • src/channels/cli_chat.rs - 添加 set_store() 方法
  • src/channels/manager.rs - 添加 cli_chat_channel 字段
  • src/gateway/mod.rs - 重构 channel 初始化流程

#3 MessageBus 被创建两次引用

修复方案: 移除 GatewayState.bus 字段,直接使用 channel_manager.bus()

修改文件:

  • src/gateway/mod.rs - 移除冗余的 bus 字段

#4 GatewayState 同时持有 channel_manager 和 cli_chat_channel

修复方案: cli_chat_channel 只通过 ChannelManager 管理,GatewayState 不再单独持有。

修改文件:

  • src/gateway/mod.rs - 移除 cli_chat_channel 字段,添加 cli_chat_channel() getter 方法

高优先级(待修复)

Session 每次重建都创建新的 LLM Provider

文件: src/gateway/session.rs:349-361

问题: 每当 session TTL 过期默认4小时就会销毁并重建 session同时创建新的 LLM provider 连接。

建议: Provider 应该池化复用,不随 session 销毁而重建。


CliChatChannel::send 广播给所有客户端

文件: src/channels/cli_chat.rs:279-289

问题: OutboundMessagechat_id 字段用于路由,但实现广播给所有客户端,而不是只发给对应 chat_id 的客户端。

建议: 根据 chat_id 过滤客户端,只发送给对应的客户端。


中优先级(待修复)

default_tools() 每次调用创建新 ToolRegistry

文件: src/gateway/session.rs:212-227

建议: 如果工具列表是只读的,直接 clone Arc如果需要修改需要澄清设计意图。


低优先级(待修复)

FeishuChannel::new 接收未使用的 provider_config

文件: src/channels/feishu.rs:175-178


OutboundDispatcher::send_with_retry 永不执行的 unreachable

文件: src/bus/dispatcher.rs:81


Channel trait 的 is_running 使用 std::sync::Mutex

文件: src/channels/base.rs:38 vs src/channels/cli_chat.rs:265-267


LoopDetector 硬编码在 AgentLoop 中

文件: src/agent/agent_loop.rs:88-172


InboundMessage 和 OutboundMessage 结构重复

文件: src/bus/message.rs


问题统计

状态 优先级 数量
已修复 - 4
待修复 2
待修复 1
待修复 5
总计 - 12