# 通信模式 **本文引用的文件** - [server/src/app.ts](file://server/src/app.ts) - [server/src/services/websocket.service.ts](file://server/src/services/websocket.service.ts) - [server/src/modules/tts/tts.controller.ts](file://server/src/modules/tts/tts.controller.ts) - [server/src/modules/auth/auth.controller.ts](file://server/src/modules/auth/auth.controller.ts) - [server/src/middleware/auth.ts](file://server/src/middleware/auth.ts) - [server/src/middleware/security.ts](file://server/src/middleware/security.ts) - [server/src/middleware/rate-limiter.ts](file://server/src/middleware/rate-limiter.ts) - [server/src/services/queue.service.ts](file://server/src/services/queue.service.ts) - [server/src/modules/book-generator/book-queue.processor.ts](file://server/src/modules/book-generator/book-queue.processor.ts) - [server/src/services/memory-queue.ts](file://server/src/services/memory-queue.ts) - [my-uniapp-vue3/src/utils/websocket.ts](file://my-uniapp-vue3/src/utils/websocket.ts) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) ## 引言 本文件面向“AI有声书生成平台”的通信模式,系统化梳理平台内部的三类通信机制:同步通信(RESTful API)、异步通信(消息队列/Bull)与实时通信(WebSocket),并结合中间件管道(请求预处理、身份验证、权限检查、响应后处理)与事件驱动架构(事件发布订阅、消息路由、错误重试),给出架构图、流程图与最佳实践,帮助开发者与运维人员快速理解与优化系统通信。 ## 项目结构 后端基于 Koa 应用,统一注册路由与中间件;前端采用 uni-app,内置 WebSocket 管理器,支持 H5 与小程序环境。平台围绕“异步任务 + 实时推送 + REST API”构建,形成高吞吐、低耦合的通信体系。 ```mermaid graph TB subgraph "前端" FE["uni-app 应用
WebSocket 管理器"] end subgraph "后端" APP["Koa 应用
路由与中间件"] WS["WebSocket 服务
/ws 路径"] Q["队列服务(Bull)
Redis/内存回退"] BKQ["书籍生成队列处理器"] end FE -- "HTTP REST API" --> APP FE -- "WebSocket" --> WS APP -- "异步任务入队" --> Q Q -- "并发执行" --> BKQ BKQ -- "事件广播" --> WS WS -- "实时推送" --> FE ``` 图表来源 - [server/src/app.ts:57-130](file://server/src/app.ts#L57-L130) - [server/src/services/websocket.service.ts:102-133](file://server/src/services/websocket.service.ts#L102-L133) - [server/src/services/queue.service.ts:48-122](file://server/src/services/queue.service.ts#L48-L122) - [server/src/modules/book-generator/book-queue.processor.ts:48-83](file://server/src/modules/book-generator/book-queue.processor.ts#L48-L83) 章节来源 - [server/src/app.ts:57-130](file://server/src/app.ts#L57-L130) ## 核心组件 - REST API 层:以 Koa Router 注册各模块路由,统一处理 CORS、BodyParser、静态资源、健康检查与指标暴露。 - 中间件管道:错误处理、性能监控、日志、安全(XSS/SQL 注入)、速率限制、认证与可选认证。 - 异步队列:Bull 队列承载音频/视频/书籍生成等长耗时任务,具备 Redis 回退与并发控制。 - 实时通信:WebSocket 服务在 /ws 路径上建立连接,向客户端推送生成完成与进度事件。 - 前端 WebSocket 管理器:封装连接、订阅、重连与事件派发,适配 H5/小程序。 章节来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) - [server/src/middleware/security.ts:6-27](file://server/src/middleware/security.ts#L6-L27) - [server/src/middleware/rate-limiter.ts:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) - [server/src/middleware/auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49) - [server/src/services/queue.service.ts:48-122](file://server/src/services/queue.service.ts#L48-L122) - [server/src/services/websocket.service.ts:102-133](file://server/src/services/websocket.service.ts#L102-L133) - [my-uniapp-vue3/src/utils/websocket.ts:15-196](file://my-uniapp-vue3/src/utils/websocket.ts#L15-L196) ## 架构总览 下图展示三类通信模式在系统中的应用位置与数据流向: ```mermaid graph TB C["客户端/浏览器"] --> |REST API| R["Koa 路由"] R --> M1["安全中间件
XSS/SQL注入"] R --> M2["速率限制中间件"] R --> M3["认证中间件"] R --> S["业务控制器
如 tts.auth.book-generator"] S --> |异步任务| Q["队列服务(Bull)"] Q --> P["队列处理器
并发执行"] P --> E["领域服务/LLM"] P --> W["WebSocket 服务"] W --> |事件推送| C subgraph "实时通道" W end subgraph "异步通道" Q P end subgraph "同步通道" R M1 M2 M3 end ``` 图表来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) - [server/src/middleware/security.ts:6-27](file://server/src/middleware/security.ts#L6-L27) - [server/src/middleware/rate-limiter.ts:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) - [server/src/middleware/auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49) - [server/src/services/queue.service.ts:48-122](file://server/src/services/queue.service.ts#L48-L122) - [server/src/services/websocket.service.ts:102-133](file://server/src/services/websocket.service.ts#L102-L133) ## 详细组件分析 ### 同步通信(RESTful API) - 设计要点 - 统一使用 Koa Router 注册模块路由,集中处理 CORS、BodyParser、静态资源与健康检查。 - 控制器内进行参数校验、权限检查与配额校验,必要时调用订阅服务与数据库。 - 对外返回统一结构,便于前端消费。 - 典型流程(TTS 生成) - 客户端发起 POST /api/tts/generate,携带文本、音色、可选书籍章节信息。 - 控制器执行 optionalAuth(可选认证)、参数校验、配额检查、调用服务生成异步任务。 - 立即返回任务创建结果,后续通过 WebSocket 推送状态。 - 安全与限流 - 安全中间件对请求体与查询参数进行 XSS/SQL 注入清洗,并设置安全响应头。 - 速率限制中间件按接口维度(API、登录、短信、TTS、上传)配置不同阈值。 - 认证中间件支持强制认证与可选认证两种模式,开发环境可跳过。 ```mermaid sequenceDiagram participant Client as "客户端" participant Router as "Koa 路由(tts)" participant MW_Auth as "认证中间件" participant MW_Rate as "限流中间件" participant MW_Sec as "安全中间件" participant Ctrl as "TTS 控制器" participant Queue as "队列服务" participant WS as "WebSocket 服务" Client->>Router : "POST /api/tts/generate" Router->>MW_Sec : "XSS/SQL 注入清洗" Router->>MW_Rate : "速率限制检查" Router->>MW_Auth : "optionalAuth/强制认证" Router->>Ctrl : "进入控制器" Ctrl->>Ctrl : "参数校验/配额检查" Ctrl->>Queue : "异步生成任务" Ctrl-->>Client : "返回任务创建结果" Queue-->>WS : "完成后推送事件" WS-->>Client : "实时推送生成完成" ``` 图表来源 - [server/src/modules/tts/tts.controller.ts:52-127](file://server/src/modules/tts/tts.controller.ts#L52-L127) - [server/src/middleware/auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49) - [server/src/middleware/rate-limiter.ts:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) - [server/src/middleware/security.ts:6-27](file://server/src/middleware/security.ts#L6-L27) - [server/src/services/queue.service.ts:131-160](file://server/src/services/queue.service.ts#L131-L160) - [server/src/services/websocket.service.ts:66-86](file://server/src/services/websocket.service.ts#L66-L86) 章节来源 - [server/src/modules/tts/tts.controller.ts:52-127](file://server/src/modules/tts/tts.controller.ts#L52-L127) - [server/src/middleware/auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49) - [server/src/middleware/rate-limiter.ts:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) - [server/src/middleware/security.ts:6-27](file://server/src/middleware/security.ts#L6-L27) ### 异步通信(消息队列/Bull) - 设计原则 - 队列仅负责排队与并发控制,失败重试、超时管理与业务逻辑分别由容错层、AI 服务层与领域层承担。 - 优先使用 Redis 队列,若不可用则回退至内存队列,保证系统可用性。 - 关键能力 - 任务类型:音频生成、视频生成、书籍生成、邮件发送等。 - 任务状态:waiting/active/completed/failed/delayed。 - 进度回调:支持任务进度上报与回调触发。 - 统计与运维:提供队列统计、暂停/恢复、清空、优雅关闭等操作。 - 书籍生成处理器 - 初始化时优先使用 Redis 队列,最大并发 3;若 Redis 不可用则使用内存队列。 - 启动时扫描数据库中处于生成中的书籍,恢复中断任务并重新入队。 ```mermaid flowchart TD Start(["提交任务"]) --> Add["入队(Redis/内存)"] Add --> Consume{"Redis可用?"} Consume --> |是| RedisProc["Redis队列处理器
并发执行"] Consume --> |否| MemProc["内存队列处理器
并发执行"] RedisProc --> Domain["领域服务/LLM生成"] MemProc --> Domain Domain --> Done{"完成?"} Done --> |是| Push["推送完成事件"] Done --> |否| Fail["标记失败/记录错误"] Push --> End(["结束"]) Fail --> End ``` 图表来源 - [server/src/services/queue.service.ts:48-122](file://server/src/services/queue.service.ts#L48-L122) - [server/src/services/memory-queue.ts:17-99](file://server/src/services/memory-queue.ts#L17-L99) - [server/src/modules/book-generator/book-queue.processor.ts:48-83](file://server/src/modules/book-generator/book-queue.processor.ts#L48-L83) 章节来源 - [server/src/services/queue.service.ts:48-122](file://server/src/services/queue.service.ts#L48-L122) - [server/src/services/memory-queue.ts:17-99](file://server/src/services/memory-queue.ts#L17-L99) - [server/src/modules/book-generator/book-queue.processor.ts:48-83](file://server/src/modules/book-generator/book-queue.processor.ts#L48-L83) ### 实时通信(WebSocket 双向通信) - 服务端 - 在 HTTP 服务器上监听 upgrade,仅接受 /ws 路径,从查询参数提取 clientId 并维护连接映射。 - 提供客户端管理(添加/移除)、广播与定向推送,支持音频/视频生成完成与批量进度事件。 - 前端 - WebSocketManager 封装连接、订阅、重连与事件派发;支持 H5 与小程序。 - 自动重连(最多 3 次,间隔 3s),重连成功后自动重新订阅事件。 - 典型流程 - 客户端连接 /ws,接收 connected 事件。 - 服务端在书籍/音频/视频生成完成后,广播对应事件,前端按 bookId 过滤并更新 UI。 ```mermaid sequenceDiagram participant FE as "前端 WebSocketManager" participant HTTP as "HTTP 服务器" participant WS as "WebSocket 服务" participant BKQ as "书籍生成处理器" FE->>HTTP : "发起 upgrade /ws?clientId=..." HTTP->>WS : "交由 WebSocket 服务处理" WS-->>FE : "发送 connected 事件" BKQ-->>WS : "生成完成事件" WS-->>FE : "广播事件(音频/视频/书籍完成)" FE->>FE : "根据 bookId 过滤并更新 UI" ``` 图表来源 - [server/src/services/websocket.service.ts:102-133](file://server/src/services/websocket.service.ts#L102-L133) - [my-uniapp-vue3/src/utils/websocket.ts:25-82](file://my-uniapp-vue3/src/utils/websocket.ts#L25-L82) - [server/src/services/websocket.service.ts:66-86](file://server/src/services/websocket.service.ts#L66-L86) 章节来源 - [server/src/services/websocket.service.ts:102-133](file://server/src/services/websocket.service.ts#L102-L133) - [my-uniapp-vue3/src/utils/websocket.ts:25-82](file://my-uniapp-vue3/src/utils/websocket.ts#L25-L82) ### 中间件管道设计模式 - 请求预处理 - CORS、BodyParser、静态资源、健康检查与指标暴露。 - 身份验证 - 强制认证:要求 Bearer Token,开发环境可通过开关跳过。 - 可选认证:无 Token 时自动降级为测试用户,便于调试。 - 权限检查 - 控制器内结合用户上下文与订阅配额进行权限判断。 - 响应后处理 - 敏感数据脱敏(密码、token 等)与统一响应结构。 - 安全加固 - XSS/SQL 注入检测与清洗,设置安全响应头。 - 速率限制 - 多维度限流策略,避免滥用与攻击。 ```mermaid flowchart TD Req["请求到达"] --> CORS["CORS/BodyParser/静态资源"] CORS --> SEC["安全中间件(XSS/SQL)"] SEC --> RL["速率限制"] RL --> AUTH["认证(强制/可选)"] AUTH --> CTRL["控制器处理"] CTRL --> RESP["统一响应/脱敏"] RESP --> End["返回客户端"] ``` 图表来源 - [server/src/app.ts:63-83](file://server/src/app.ts#L63-L83) - [server/src/middleware/security.ts:6-27](file://server/src/middleware/security.ts#L6-L27) - [server/src/middleware/rate-limiter.ts:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) - [server/src/middleware/auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49) 章节来源 - [server/src/app.ts:63-83](file://server/src/app.ts#L63-L83) - [server/src/middleware/security.ts:6-27](file://server/src/middleware/security.ts#L6-L27) - [server/src/middleware/rate-limiter.ts:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) - [server/src/middleware/auth.ts:7-49](file://server/src/middleware/auth.ts#L7-L49) ### 事件驱动架构与错误重试 - 事件发布订阅 - 书籍生成完成后,通过 WebSocket 广播事件;前端按需订阅。 - 消息路由 - 队列服务负责任务路由与并发调度;处理器根据任务类型路由到相应领域服务。 - 错误重试与恢复 - 队列层不负责失败重试,重试策略由容错层承担;超时与业务异常由 LLM/领域服务处理。 - 服务器启动时扫描数据库中处于生成中的书籍,自动恢复中断任务并重新入队。 ```mermaid flowchart TD Scan["启动时扫描中断任务"] --> ReEnq["重新入队"] ReEnq --> Proc["队列处理器执行"] Proc --> OK{"成功?"} OK --> |是| Notify["推送完成事件"] OK --> |否| FT["容错层重试/告警"] Notify --> End["结束"] FT --> End ``` 图表来源 - [server/src/modules/book-generator/book-queue.processor.ts:88-124](file://server/src/modules/book-generator/book-queue.processor.ts#L88-L124) - [server/src/services/queue.service.ts:131-160](file://server/src/services/queue.service.ts#L131-L160) 章节来源 - [server/src/modules/book-generator/book-queue.processor.ts:88-124](file://server/src/modules/book-generator/book-queue.processor.ts#L88-L124) - [server/src/services/queue.service.ts:131-160](file://server/src/services/queue.service.ts#L131-L160) ## 依赖关系分析 - 应用层依赖 - app.ts 统一注册路由与中间件,启动时初始化 Sentry、数据库、Redis、存储、WebSocket、书籍生成队列与中断任务恢复。 - 控制器依赖 - tts.controller.ts 依赖订阅服务与数据库进行配额与存在性校验。 - auth.controller.ts 依赖认证服务与数据库进行用户信息读取与更新。 - 服务层依赖 - queue.service.ts 依赖 redis.service 与 memory-queue;book-queue.processor.ts 依赖 langGraphGenerator、bookStore、prisma。 - 实时通信依赖 - websocket.service.ts 依赖 ws;前端 websocket.ts 依赖 uni.connectSocket 与配置。 ```mermaid graph LR APP["app.ts"] --> WS["websocket.service.ts"] APP --> Q["queue.service.ts"] APP --> BKQ["book-queue.processor.ts"] BKQ --> LG["langGraphGenerator"] BKQ --> BS["book-store"] BKQ --> PRISMA["prisma"] TTS["tts.controller.ts"] --> SUB["subscription.service.ts"] AUTHC["auth.controller.ts"] --> AUTHS["auth.service.ts"] ``` 图表来源 - [server/src/app.ts:133-172](file://server/src/app.ts#L133-L172) - [server/src/services/websocket.service.ts:102-133](file://server/src/services/websocket.service.ts#L102-L133) - [server/src/services/queue.service.ts:48-122](file://server/src/services/queue.service.ts#L48-L122) - [server/src/modules/book-generator/book-queue.processor.ts:48-83](file://server/src/modules/book-generator/book-queue.processor.ts#L48-L83) 章节来源 - [server/src/app.ts:133-172](file://server/src/app.ts#L133-L172) - [server/src/modules/book-generator/book-queue.processor.ts:48-83](file://server/src/modules/book-generator/book-queue.processor.ts#L48-L83) ## 性能考量 - 队列并发与超时 - 书籍生成任务最大并发 3,超时 2 小时;音频 5 分钟、视频 10 分钟,避免长时间占用资源。 - 限流策略 - 全局限流、登录限流、短信限流、TTS 限流、上传限流,按接口与用户维度精细化控制。 - 缓存与存储 - Redis 可用时优先使用;存储类型可切换(OSS/本地),启动时进行连通性检测。 - 前端重连与订阅 - WebSocketManager 自动重连与事件重订阅,降低弱网与断线影响。 章节来源 - [server/src/services/queue.service.ts:166-190](file://server/src/services/queue.service.ts#L166-L190) - [server/src/middleware/rate-limiter.ts:77-120](file://server/src/middleware/rate-limiter.ts#L77-L120) - [server/src/app.ts:142-151](file://server/src/app.ts#L142-L151) - [my-uniapp-vue3/src/utils/websocket.ts:162-190](file://my-uniapp-vue3/src/utils/websocket.ts#L162-L190) ## 故障排查指南 - WebSocket 连接问题 - 检查 /ws 路径与 clientId 参数;确认服务端升级处理逻辑与客户端重连策略。 - 查看服务端日志与客户端 onOpen/onError/onClose 回调。 - 队列不可用 - Redis 不可用时会回退到内存队列;检查 Redis 连接与队列可用性标志。 - 关注队列错误事件与处理器的 completed/failed 回调。 - 认证与限流 - 确认 Authorization 头格式与 Token 有效性;检查限流中间件返回的 Retry-After。 - 安全拦截 - 若出现 400 非法字符提示,检查请求体与查询参数是否包含 SQL 注入特征。 - 优雅关闭 - 服务端监听 SIGTERM/SIGINT,确保队列与 Redis 正常关闭。 章节来源 - [server/src/services/websocket.service.ts:102-133](file://server/src/services/websocket.service.ts#L102-L133) - [server/src/services/queue.service.ts:53-59](file://server/src/services/queue.service.ts#L53-L59) - [server/src/middleware/rate-limiter.ts:52-71](file://server/src/middleware/rate-limiter.ts#L52-L71) - [server/src/middleware/security.ts:69-83](file://server/src/middleware/security.ts#L69-L83) - [server/src/app.ts:174-187](file://server/src/app.ts#L174-L187) ## 结论 该平台通过“REST API + 队列 + WebSocket”的组合实现了高可用、可扩展的通信体系:同步 API 提供即时交互体验,异步队列承载长耗时任务并具备回退与恢复能力,实时 WebSocket 保障事件推送的及时性。配合完善的中间件管道(安全、限流、认证)与事件驱动架构,系统在安全性、性能与可靠性方面均具备良好基础。建议在生产环境中启用全局限流与认证开关,并持续监控队列与 WebSocket 的运行状态,以进一步提升稳定性与用户体验。