本文引用的文件
本文件面向“AI有声书生成平台”的通信模式,系统化梳理平台内部的三类通信机制:同步通信(RESTful API)、异步通信(消息队列/Bull)与实时通信(WebSocket),并结合中间件管道(请求预处理、身份验证、权限检查、响应后处理)与事件驱动架构(事件发布订阅、消息路由、错误重试),给出架构图、流程图与最佳实践,帮助开发者与运维人员快速理解与优化系统通信。
后端基于 Koa 应用,统一注册路由与中间件;前端采用 uni-app,内置 WebSocket 管理器,支持 H5 与小程序环境。平台围绕“异步任务 + 实时推送 + REST API”构建,形成高吞吐、低耦合的通信体系。
graph TB
subgraph "前端"
FE["uni-app 应用<br/>WebSocket 管理器"]
end
subgraph "后端"
APP["Koa 应用<br/>路由与中间件"]
WS["WebSocket 服务<br/>/ws 路径"]
Q["队列服务(Bull)<br/>Redis/内存回退"]
BKQ["书籍生成队列处理器"]
end
FE -- "HTTP REST API" --> APP
FE -- "WebSocket" --> WS
APP -- "异步任务入队" --> Q
Q -- "并发执行" --> BKQ
BKQ -- "事件广播" --> WS
WS -- "实时推送" --> FE
图表来源
章节来源
章节来源
下图展示三类通信模式在系统中的应用位置与数据流向:
graph TB
C["客户端/浏览器"] --> |REST API| R["Koa 路由"]
R --> M1["安全中间件<br/>XSS/SQL注入"]
R --> M2["速率限制中间件"]
R --> M3["认证中间件"]
R --> S["业务控制器<br/>如 tts.auth.book-generator"]
S --> |异步任务| Q["队列服务(Bull)"]
Q --> P["队列处理器<br/>并发执行"]
P --> E["领域服务/LLM"]
P --> W["WebSocket 服务"]
W --> |事件推送| C
subgraph "实时通道"
W
end
subgraph "异步通道"
Q
P
end
subgraph "同步通道"
R
M1
M2
M3
end
图表来源
安全与限流
认证中间件支持强制认证与可选认证两种模式,开发环境可跳过。
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 : "实时推送生成完成"
图表来源
章节来源
书籍生成处理器
启动时扫描数据库中处于生成中的书籍,恢复中断任务并重新入队。
flowchart TD
Start(["提交任务"]) --> Add["入队(Redis/内存)"]
Add --> Consume{"Redis可用?"}
Consume --> |是| RedisProc["Redis队列处理器<br/>并发执行"]
Consume --> |否| MemProc["内存队列处理器<br/>并发执行"]
RedisProc --> Domain["领域服务/LLM生成"]
MemProc --> Domain
Domain --> Done{"完成?"}
Done --> |是| Push["推送完成事件"]
Done --> |否| Fail["标记失败/记录错误"]
Push --> End(["结束"])
Fail --> End
图表来源
章节来源
典型流程
服务端在书籍/音频/视频生成完成后,广播对应事件,前端按 bookId 过滤并更新 UI。
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"
图表来源
章节来源
速率限制
多维度限流策略,避免滥用与攻击。
flowchart TD
Req["请求到达"] --> CORS["CORS/BodyParser/静态资源"]
CORS --> SEC["安全中间件(XSS/SQL)"]
SEC --> RL["速率限制"]
RL --> AUTH["认证(强制/可选)"]
AUTH --> CTRL["控制器处理"]
CTRL --> RESP["统一响应/脱敏"]
RESP --> End["返回客户端"]
图表来源
章节来源
错误重试与恢复
服务器启动时扫描数据库中处于生成中的书籍,自动恢复中断任务并重新入队。
flowchart TD
Scan["启动时扫描中断任务"] --> ReEnq["重新入队"]
ReEnq --> Proc["队列处理器执行"]
Proc --> OK{"成功?"}
OK --> |是| Notify["推送完成事件"]
OK --> |否| FT["容错层重试/告警"]
Notify --> End["结束"]
FT --> End
图表来源
章节来源
实时通信依赖
websocket.service.ts 依赖 ws;前端 websocket.ts 依赖 uni.connectSocket 与配置。
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"]
图表来源
章节来源
章节来源
章节来源
该平台通过“REST API + 队列 + WebSocket”的组合实现了高可用、可扩展的通信体系:同步 API 提供即时交互体验,异步队列承载长耗时任务并具备回退与恢复能力,实时 WebSocket 保障事件推送的及时性。配合完善的中间件管道(安全、限流、认证)与事件驱动架构,系统在安全性、性能与可靠性方面均具备良好基础。建议在生产环境中启用全局限流与认证开关,并持续监控队列与 WebSocket 的运行状态,以进一步提升稳定性与用户体验。