mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-21 22:53:56 +08:00
5.4 KiB
5.4 KiB
目标架构
1. 架构决策
统一平台采用“模块化单体代码库、按职责运行”的结构:
Public HTTP/WSS
|
v
Gateway / static web
| | |
| | +--> /mcp/vision/explain
| +--------------------> /xiaozhi/v1/ -> realtime
+-------------------------------> /xiaozhi/* -> api
api ----------- application services -------- database / redis / object files
realtime ------ application services -------- provider adapters
jobs ---------- application services -------- scheduled work
同一发布版本提供四个角色:
| 角色 | 职责 | 扩缩容方式 |
|---|---|---|
gateway |
manager-web、TLS、静态缓存、HTTP/WS 路由 | 无状态横向扩展 |
api |
管理 REST、OTA、文件和内部服务端 API | 多 worker/多副本 |
realtime |
设备 WebSocket、音频会话、Vision、Provider 和工具 | 按连接与模型容量扩展 |
jobs |
定时同步、清理和异步补偿 | Redis 租约保证单任务所有权 |
开发环境可以用一个命令启动全部角色;生产环境不得要求 realtime 与 API 共享 worker。
2. 建议代码边界
main/manager-api-fastapi/
├── app/
│ ├── api/ # HTTP 路由和请求适配
│ ├── application/ # 用例服务;HTTP、WS、jobs 共用
│ ├── domain/ # 稳定业务对象和接口
│ ├── realtime/ # ASGI WebSocket、会话和协议
│ ├── providers/ # VAD/ASR/LLM/VLLM/TTS/Memory/Intent/Tools
│ ├── infrastructure/ # MySQL、Redis、文件、外部客户端
│ └── jobs/
├── web/ # manager-web 构建集成或其产物约定
├── tests/
│ ├── unit/
│ ├── contract/
│ ├── integration/
│ ├── protocol/
│ └── e2e/
└── deploy/
迁移期间允许现有目录继续存在;目录调整必须跟随可运行的纵向切片,不做只有移动文件的超大 PR。
3. 关键内部接口
3.1 应用服务
Realtime 不再通过 HTTP 调用同一平台。以下能力通过应用服务接口复用:
- 获取全局配置和设备专属 Agent 配置。
- 设备绑定、激活、在线状态和通讯录查找。
- 聊天记录、音频、摘要、标题和工具调用上报。
- OTA、文件和参数读取。
HTTP 只是这些服务的一个适配器。服务方法不接收 FastAPI Request,也不返回 HTTP Response。
3.2 实时会话
每个连接由一个 DeviceSession 拥有,至少包含:
- 握手元数据与设备鉴权。
- 有界输入/输出音频队列。
- 文本协议路由。
- VAD/ASR/LLM/TTS/工具调用任务。
- 取消、超时、断线保存和资源关闭。
使用 ASGI WebSocket 抽象,不让 Provider 依赖 Starlette 或 websockets.ServerConnection。
3.3 Provider
Provider 通过能力协议注册,配置标识保持现状。同步 SDK 必须通过受限线程池或专用执行器调用, 禁止在事件循环中直接进行阻塞网络或长时间 CPU 工作。
Provider 按以下能力族迁移:
- VAD + ASR。
- LLM + VLLM + Memory + Intent。
- TTS。
- Tools + MCP + IoT + 插件。
本地 Torch/FunASR/Sherpa 等能力作为可选依赖组和镜像 profile,基础 API 镜像不强制加载模型。
4. 配置与控制面
- 数据库是完整模式下的配置事实来源。
- Redis 保存有版本号的缓存,并通过 Pub/Sub 广播配置失效和控制事件。
- worker 原子替换共享配置;现有会话可完成当前轮次,新会话使用新版本。
server.secret、SM2 密钥和其他必需系统参数由并发安全的 bootstrap 初始化。- 进程重启交给容器编排或服务管理器,业务代码不自行 fork、spawn 或
os._exit()。 - 轻量模式使用文件配置适配器,但进入相同应用服务,不复制 OTA 或会话实现。
5. 路由与兼容策略
| 公共入口 | 所有者 | 迁移策略 |
|---|---|---|
/ |
manager-web | 构建产物由 gateway 托管,保留 PWA scope |
/xiaozhi/* |
api | 保留当前调用方契约 |
/xiaozhi/ota/ |
api | 完整模式只保留数据库驱动实现 |
/xiaozhi/v1/ |
realtime | 保持设备协议,gateway 支持 Upgrade |
/mcp/vision/explain |
realtime | 独立设备鉴权域,不继承管理用户鉴权 |
迁移期可以继续监听 8000/8002/8003 作为兼容别名;最终公网地址由 gateway 统一,OTA 返回值和 系统参数必须在切换前验证。
6. 部署档位
Lite
- 单 worker。
- 文件或数据库配置。
- 可将 API、realtime 和 jobs 放在同一进程用于本地体验。
- 不作为生产容量结论的依据。
Production
- gateway、API、realtime、jobs 独立进程或容器。
- 共享 MySQL、Redis 和明确的持久化卷。
- realtime 按模型内存和连接数单独扩容。
- 发布时先摘流,等待连接排空,再终止旧实例。
7. 架构完成门禁
- 公开契约清单有可执行测试。
- API 与 realtime 不通过环回 HTTP 互调。
- 多 realtime worker 的配置更新能够广播到全部实例。
- realtime 停止时不产生孤儿线程、遗留任务或自行启动的新进程。
- Lite 与 Production 使用相同业务实现。
- 旧 xiaozhi-server 入口只有在新实现通过全部自动门禁后才能删除。