# 服务基础设施 **本文引用的文件** - [server/src/app.ts](file://server/src/app.ts) - [server/src/services/redis.service.ts](file://server/src/services/redis.service.ts) - [server/src/services/oss.service.ts](file://server/src/services/oss.service.ts) - [server/src/services/queue.service.ts](file://server/src/services/queue.service.ts) - [server/src/services/sentry.service.ts](file://server/src/services/sentry.service.ts) - [server/src/services/websocket.service.ts](file://server/src/services/websocket.service.ts) - [server/src/services/storage.service.ts](file://server/src/services/storage.service.ts) - [server/src/services/memory-queue.ts](file://server/src/services/memory-queue.ts) - [server/src/modules/book-generator/book-queue.processor.ts](file://server/src/modules/book-generator/book-queue.processor.ts) - [server/src/middleware/auth.ts](file://server/src/middleware/auth.ts) - [server/src/middleware/errorHandler.ts](file://server/src/middleware/errorHandler.ts) - [server/src/middleware/security.ts](file://server/src/middleware/security.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/src/middleware/rate-limiter.ts](file://server/src/middleware/rate-limiter.ts) - [server/src/config/index.ts](file://server/src/config/index.ts) - [server/src/types/index.ts](file://server/src/types/index.ts) - [server/src/models/index.ts](file://server/src/models/index.ts) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向AI有声书生成平台的服务基础设施,系统性梳理支撑业务模块运行的基础服务组件与中间件体系,覆盖以下主题: - 队列服务:基于Bull的异步任务处理与降级策略 - 缓存服务:Redis缓存管理与连接健康检查 - 存储服务:阿里云OSS与本地存储的统一抽象 - 日志与监控:Sentry错误监控与性能追踪 - WebSocket服务:实时事件推送 - 中间件体系:认证、错误处理、安全、性能监控、限流 - 类型定义与配置管理 - 服务启动流程与优雅关闭 ## 项目结构 后端采用Koa应用,按“服务层、中间件、控制器、配置与类型”分层组织;基础设施组件以“服务单例”的形式注入应用生命周期。 ```mermaid graph TB subgraph "应用层" APP["Koa 应用
server/src/app.ts"] ROUTER["路由注册
server/src/app.ts"] end subgraph "基础设施服务" REDIS["Redis 服务
server/src/services/redis.service.ts"] QUEUE["队列服务(Bull)
server/src/services/queue.service.ts"] MEMQ["内存队列(Fallback)
server/src/services/memory-queue.ts"] OSS["OSS 服务
server/src/services/oss.service.ts"] STORE["存储服务(统一封装)
server/src/services/storage.service.ts"] WS["WebSocket 服务
server/src/services/websocket.service.ts"] SENTRY["Sentry 监控
server/src/services/sentry.service.ts"] end subgraph "中间件" AUTH["认证中间件
server/src/middleware/auth.ts"] ERR["错误处理中间件
server/src/middleware/errorHandler.ts"] SEC["安全中间件
server/src/middleware/security.ts"] PERF["性能监控中间件
server/src/middleware/performance.ts"] RL["限流中间件
server/src/middleware/rate-limiter.ts"] end subgraph "业务与配置" CFG["配置管理
server/src/config/index.ts"] TYPES["类型定义
server/src/types/index.ts"] MODELS["数据库连接
server/src/models/index.ts"] BOOKQ["书籍生成队列处理器
server/src/modules/book-generator/book-queue.processor.ts"] end APP --> ROUTER APP --> AUTH APP --> ERR APP --> SEC APP --> PERF APP --> RL ROUTER --> STORE ROUTER --> QUEUE ROUTER --> WS ROUTER --> SENTRY STORE --> OSS STORE --> REDIS QUEUE --> REDIS QUEUE --> MEMQ WS --> APP SENTRY --> APP BOOKQ --> QUEUE BOOKQ --> MEMQ CFG --> APP TYPES --> APP MODELS --> APP ``` 图表来源 - [server/src/app.ts:1-194](file://server/src/app.ts#L1-L194) - [server/src/services/redis.service.ts:1-274](file://server/src/services/redis.service.ts#L1-L274) - [server/src/services/oss.service.ts:1-256](file://server/src/services/oss.service.ts#L1-L256) - [server/src/services/queue.service.ts:1-347](file://server/src/services/queue.service.ts#L1-L347) - [server/src/services/storage.service.ts:1-278](file://server/src/services/storage.service.ts#L1-L278) - [server/src/services/websocket.service.ts:1-136](file://server/src/services/websocket.service.ts#L1-L136) - [server/src/services/sentry.service.ts:1-113](file://server/src/services/sentry.service.ts#L1-L113) - [server/src/services/memory-queue.ts:1-119](file://server/src/services/memory-queue.ts#L1-L119) - [server/src/modules/book-generator/book-queue.processor.ts:1-124](file://server/src/modules/book-generator/book-queue.processor.ts#L1-L124) - [server/src/middleware/auth.ts:1-81](file://server/src/middleware/auth.ts#L1-L81) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/src/middleware/security.ts:1-154](file://server/src/middleware/security.ts#L1-L154) - [server/src/middleware/performance.ts:1-110](file://server/src/middleware/performance.ts#L1-L110) - [server/src/middleware/rate-limiter.ts:1-120](file://server/src/middleware/rate-limiter.ts#L1-L120) - [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117) - [server/src/types/index.ts:1-124](file://server/src/types/index.ts#L1-L124) - [server/src/models/index.ts:1-15](file://server/src/models/index.ts#L1-L15) 章节来源 - [server/src/app.ts:1-194](file://server/src/app.ts#L1-L194) ## 核心组件 - 队列服务(Bull + Redis/Fallback):负责任务排队、并发控制与状态跟踪,支持Redis队列与内存队列双通道降级。 - 缓存服务(Redis):提供键值、Hash、计数器等操作,具备连接健康检查与重试策略。 - 存储服务(OSS + 本地):统一抽象上传/下载/删除/签名URL能力,支持OSS与本地存储无缝切换。 - 日志与监控(Sentry):初始化错误监控与性能剖析,提供Koa错误处理中间件。 - WebSocket服务:提供升级握手、客户端连接管理与事件广播,用于实时推送生成结果。 - 中间件体系:认证、错误处理、安全防护、性能监控、限流。 - 配置与类型:集中管理模型配置、JWT、端口、上传目录等;定义用户、音频、订单、分页等类型。 章节来源 - [server/src/services/queue.service.ts:1-347](file://server/src/services/queue.service.ts#L1-L347) - [server/src/services/redis.service.ts:1-274](file://server/src/services/redis.service.ts#L1-L274) - [server/src/services/storage.service.ts:1-278](file://server/src/services/storage.service.ts#L1-L278) - [server/src/services/sentry.service.ts:1-113](file://server/src/services/sentry.service.ts#L1-L113) - [server/src/services/websocket.service.ts:1-136](file://server/src/services/websocket.service.ts#L1-L136) - [server/src/middleware/auth.ts:1-81](file://server/src/middleware/auth.ts#L1-L81) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/src/middleware/security.ts:1-154](file://server/src/middleware/security.ts#L1-L154) - [server/src/middleware/performance.ts:1-110](file://server/src/middleware/performance.ts#L1-L110) - [server/src/middleware/rate-limiter.ts:1-120](file://server/src/middleware/rate-limiter.ts#L1-L120) - [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117) - [server/src/types/index.ts:1-124](file://server/src/types/index.ts#L1-L124) ## 架构总览 下图展示服务启动与组件交互的关键路径,包括启动顺序、依赖注入与优雅关闭流程。 ```mermaid sequenceDiagram participant Boot as "应用启动
server/src/app.ts" participant Sentry as "Sentry 初始化
server/src/services/sentry.service.ts" participant DB as "数据库连接
server/src/models/index.ts" participant Redis as "Redis 连接
server/src/services/redis.service.ts" participant Store as "存储服务
server/src/services/storage.service.ts" participant WS as "WebSocket 初始化
server/src/services/websocket.service.ts" participant Q as "队列处理器
server/src/modules/book-generator/book-queue.processor.ts" Boot->>Sentry : 初始化错误监控 Boot->>DB : 连接数据库 Boot->>Redis : 测试连接 Boot->>Store : 测试存储连接 Boot->>WS : 初始化WebSocket Boot->>Q : 启动书籍生成队列处理器 Boot-->>Boot : 注册路由与中间件 Boot-->>Boot : 监听端口并输出启动信息 Boot->>Q : 恢复中断任务 Boot->>Boot : 注册SIGTERM/SIGINT优雅关闭 ``` 图表来源 - [server/src/app.ts:133-192](file://server/src/app.ts#L133-L192) - [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43) - [server/src/models/index.ts:5-13](file://server/src/models/index.ts#L5-L13) - [server/src/services/redis.service.ts:246-255](file://server/src/services/redis.service.ts#L246-L255) - [server/src/services/storage.service.ts:252-272](file://server/src/services/storage.service.ts#L252-L272) - [server/src/services/websocket.service.ts:102-133](file://server/src/services/websocket.service.ts#L102-L133) - [server/src/modules/book-generator/book-queue.processor.ts:48-83](file://server/src/modules/book-generator/book-queue.processor.ts#L48-L83) ## 详细组件分析 ### 队列服务(Bull + Redis/Fallback) - 设计原则:单一职责,仅负责排队与并发控制;失败重试与超时由上层容错与LLM服务处理。 - 关键能力: - 任务类型枚举与状态映射 - Redis队列创建与事件监听(完成/失败/错误) - 任务添加与回退到内存队列 - 进度更新与回调管理 - 统计与暂停/恢复/清空队列 - 书籍生成队列处理器: - 优先使用Redis队列,最大并发3 - 失败时更新书籍状态为failed - 启动时恢复中断任务(根据数据库状态) ```mermaid classDiagram class QueueService { -queues : Map -progressCallbacks : Map -queueAvailable : boolean +isQueueAvailable() boolean +addTask(queueType, data, options) Promise +addAudioGenerationTask(data) Promise +addVideoGenerationTask(data) Promise +addBookGenerationTask(data) Promise +getTaskStatus(queueType, jobId) Promise +updateProgress(queueType, jobId, progress, data) Promise +onProgress(jobId, callback) void +clearQueue(queueType) Promise +pauseQueue(queueType) Promise +resumeQueue(queueType) Promise +closeAll() Promise } class MemoryQueue { -jobs : Map -waitingJobs : Array -processing : Set -concurrency : number +add(name, data) Promise +process(concurrency, handler) void +hasPendingJobs() boolean +close() Promise } class BookQueueProcessor { +initBookGenerationQueue() void +resumeInterruptedTasks() Promise } QueueService --> MemoryQueue : "回退" BookQueueProcessor --> QueueService : "使用" BookQueueProcessor --> MemoryQueue : "回退" ``` 图表来源 - [server/src/services/queue.service.ts:48-342](file://server/src/services/queue.service.ts#L48-L342) - [server/src/services/memory-queue.ts:17-116](file://server/src/services/memory-queue.ts#L17-L116) - [server/src/modules/book-generator/book-queue.processor.ts:16-83](file://server/src/modules/book-generator/book-queue.processor.ts#L16-L83) 章节来源 - [server/src/services/queue.service.ts:1-347](file://server/src/services/queue.service.ts#L1-L347) - [server/src/services/memory-queue.ts:1-119](file://server/src/services/memory-queue.ts#L1-L119) - [server/src/modules/book-generator/book-queue.processor.ts:1-124](file://server/src/modules/book-generator/book-queue.processor.ts#L1-L124) ### 缓存服务(Redis) - 连接与健康:支持重试策略、连接/错误/关闭事件监听;提供可用性检测。 - 基础操作:字符串、JSON、Hash、计数器、过期、存在性检查。 - 批量操作:支持通配符批量删除。 - 断线保护:在不可用时返回空/失败,避免阻塞主流程。 ```mermaid flowchart TD Start(["调用缓存方法"]) --> CheckAvail["检查连接可用性"] CheckAvail --> |不可用| ReturnNull["返回空/失败"] CheckAvail --> |可用| OperSel{"选择操作类型"} OperSel --> Get["GET/GET JSON"] OperSel --> Set["SET/SETEX/SET JSON"] OperSel --> Del["DEL/DEL Pattern"] OperSel --> HGet["HGET/HGETALL/HSET"] OperSel --> Incr["INCR/EXPIRE/EXISTS"] Get --> Done(["返回结果"]) Set --> Done Del --> Done HGet --> Done Incr --> Done ``` 图表来源 - [server/src/services/redis.service.ts:43-255](file://server/src/services/redis.service.ts#L43-L255) 章节来源 - [server/src/services/redis.service.ts:1-274](file://server/src/services/redis.service.ts#L1-L274) ### 存储服务(OSS + 本地) - 统一接口:上传音频/视频/封面、通用文件上传、Buffer上传、删除、目录删除、下载、签名URL、测试连接。 - 存储切换:通过环境变量STORAGE_TYPE在OSS与本地之间切换;OSS模式下支持CDN域名与签名URL。 - 本地模式:文件写入uploads目录,返回静态URL。 ```mermaid classDiagram class StorageService { -storageType : StorageType +setStorageType(type) void +getStorageType() StorageType +uploadAudio(localPath, audioId) Promise +uploadVideo(localPath, videoId) Promise +uploadCover(localPath, bookId) Promise +uploadFile(localPath, category, id) Promise +uploadBuffer(buffer, objectKey, contentType) Promise +deleteFile(url) Promise +deleteDirectory(prefix, id) Promise +downloadFile(url) Promise +getSignedUrl(url, expires) Promise +testConnection() Promise } class OSSService { +uploadFile(localPath, objectKey) Promise +uploadBuffer(buffer, objectKey, contentType) Promise +uploadAudio(localPath, audioId) Promise +uploadVideo(localPath, videoId) Promise +uploadCover(localPath, bookId) Promise +deleteFile(objectKey) Promise +deleteDirectory(prefix) Promise +getSignedUrl(objectKey, expires) Promise +downloadFile(objectKey) Promise +getFileUrl(objectKey) string +testConnection() Promise } StorageService --> OSSService : "OSS模式委托" ``` 图表来源 - [server/src/services/storage.service.ts:13-277](file://server/src/services/storage.service.ts#L13-L277) - [server/src/services/oss.service.ts:13-256](file://server/src/services/oss.service.ts#L13-L256) 章节来源 - [server/src/services/storage.service.ts:1-278](file://server/src/services/storage.service.ts#L1-L278) - [server/src/services/oss.service.ts:1-256](file://server/src/services/oss.service.ts#L1-L256) ### 日志与监控(Sentry) - 初始化:根据环境变量DSN启用,设置采样率与性能剖析集成;提供错误过滤策略。 - 上下文:设置用户、标签、额外上下文;提供Koa错误处理中间件。 - 使用场景:全局错误捕获、API异常上报、性能采样。 ```mermaid sequenceDiagram participant App as "应用启动
server/src/app.ts" participant Sentry as "Sentry 初始化
server/src/services/sentry.service.ts" participant Koa as "Koa 中间件链
server/src/app.ts" participant Ctrl as "控制器/服务" App->>Sentry : initSentry() App->>Koa : 使用 sentryErrorHandler() Koa->>Ctrl : 调用业务逻辑 Ctrl-->>Koa : 抛出异常 Koa->>Sentry : captureException(error) Sentry-->>Koa : 上报完成 ``` 图表来源 - [server/src/app.ts:64-65](file://server/src/app.ts#L64-L65) - [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43) - [server/src/services/sentry.service.ts:92-110](file://server/src/services/sentry.service.ts#L92-L110) 章节来源 - [server/src/services/sentry.service.ts:1-113](file://server/src/services/sentry.service.ts#L1-L113) - [server/src/app.ts:133-137](file://server/src/app.ts#L133-L137) ### WebSocket服务(实时通信) - 升级握手:仅接受/ws路径,从查询参数提取clientId并建立连接。 - 客户端管理:Map维护clientId到WebSocket实例映射,支持添加/移除。 - 事件推送:广播与定向推送,用于音频/视频生成完成与批量生成进度。 ```mermaid sequenceDiagram participant Client as "客户端" participant Server as "HTTP服务器
server/src/app.ts" participant WS as "WebSocket服务
server/src/services/websocket.service.ts" Client->>Server : HTTP Upgrade 请求 /ws?clientId=... Server->>WS : 触发 upgrade 事件 WS->>WS : 校验路径与clientId WS->>Client : 发送 connected 消息 WS->>Client : 广播/定向推送生成进度/完成事件 Client-->>WS : 断开连接 WS->>WS : 移除客户端 ``` 图表来源 - [server/src/app.ts:156-157](file://server/src/app.ts#L156-L157) - [server/src/services/websocket.service.ts:102-133](file://server/src/services/websocket.service.ts#L102-L133) 章节来源 - [server/src/services/websocket.service.ts:1-136](file://server/src/services/websocket.service.ts#L1-L136) - [server/src/app.ts:156-157](file://server/src/app.ts#L156-L157) ### 中间件体系 - 认证中间件:支持可选认证与强制认证,校验JWT并注入用户信息。 - 错误处理中间件:统一捕获异常,返回标准化错误响应。 - 安全中间件:XSS过滤、SQL注入检测、敏感数据脱敏。 - 性能监控中间件:统计总请求数、平均响应时间、慢请求、错误率与端点级指标。 - 限流中间件:基于Redis/Memory的限流器,支持多场景限流策略。 ```mermaid flowchart TD Req["请求进入"] --> EH["错误处理中间件"] EH --> PM["性能监控中间件"] PM --> SEC["安全中间件(XSS/SQL/脱敏)"] SEC --> AUTH["认证中间件(可选/强制)"] AUTH --> RL["限流中间件(可插拔)"] RL --> Route["路由匹配与控制器"] Route --> RESP["响应返回"] EH --> |异常| RESP ``` 图表来源 - [server/src/app.ts:64-75](file://server/src/app.ts#L64-L75) - [server/src/middleware/errorHandler.ts:3-24](file://server/src/middleware/errorHandler.ts#L3-L24) - [server/src/middleware/performance.ts:29-76](file://server/src/middleware/performance.ts#L29-L76) - [server/src/middleware/security.ts:7-27](file://server/src/middleware/security.ts#L7-L27) - [server/src/middleware/auth.ts:7-18](file://server/src/middleware/auth.ts#L7-L18) - [server/src/middleware/rate-limiter.ts:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) 章节来源 - [server/src/middleware/auth.ts:1-81](file://server/src/middleware/auth.ts#L1-L81) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/src/middleware/security.ts:1-154](file://server/src/middleware/security.ts#L1-L154) - [server/src/middleware/performance.ts:1-110](file://server/src/middleware/performance.ts#L1-L110) - [server/src/middleware/rate-limiter.ts:1-120](file://server/src/middleware/rate-limiter.ts#L1-L120) ### 类型定义与配置管理 - 类型定义:用户、音频、订单、分页、音色、会员配额等;扩展Koa Context以携带用户信息。 - 配置管理:加载.env,聚合模型配置,提供模型切换策略与默认值;JWT密钥与TTS参数等。 章节来源 - [server/src/types/index.ts:1-124](file://server/src/types/index.ts#L1-L124) - [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117) ## 依赖关系分析 - 组件耦合: - QueueService依赖RedisService与MemoryQueue;书籍生成处理器依赖QueueService/MemoryQueue。 - StorageService依赖OSSService与本地FS;在OSS模式下进一步依赖OSS SDK。 - Sentry中间件与服务贯穿全局;WebSocket服务由HTTP服务器升级触发。 - 中间件按顺序装配,形成统一的请求处理管线。 - 外部依赖: - Bull(Redis队列)、ioredis(Redis客户端)、ali-oss(阿里云OSS)、ws(WebSocket)、rate-limiter-flexible(限流)等。 ```mermaid graph LR Queue["QueueService"] --> Redis["RedisService"] Queue --> MemQ["MemoryQueue"] Store["StorageService"] --> OSS["OSSService"] App["Koa App"] --> Sentry["Sentry服务"] App --> WS["WebSocket服务"] App --> Auth["认证中间件"] App --> Err["错误处理中间件"] App --> Sec["安全中间件"] App --> Perf["性能监控中间件"] App --> RL["限流中间件"] ``` 图表来源 - [server/src/services/queue.service.ts:18-20](file://server/src/services/queue.service.ts#L18-L20) - [server/src/services/storage.service.ts:6](file://server/src/services/storage.service.ts#L6) - [server/src/app.ts:64-75](file://server/src/app.ts#L64-L75) 章节来源 - [server/src/services/queue.service.ts:1-347](file://server/src/services/queue.service.ts#L1-L347) - [server/src/services/storage.service.ts:1-278](file://server/src/services/storage.service.ts#L1-L278) - [server/src/app.ts:1-194](file://server/src/app.ts#L1-L194) ## 性能考量 - 队列并发:书籍生成队列最大并发3,避免资源争用;内存队列作为降级保障。 - 缓存命中:合理设置TTL与键命名规范,减少热点Key竞争。 - 存储I/O:OSS上传使用合适的内容类型与CDN加速;本地存储注意磁盘IO与目录层级。 - 监控指标:性能中间件统计慢请求与错误率,便于定位瓶颈。 - 限流策略:针对不同接口设定差异化限流,防止突发流量冲击。 ## 故障排查指南 - Redis不可用: - 现象:队列不可用标记,任务回退至内存队列;缓存读写返回空。 - 排查:检查连接参数、网络连通性、密码与DB索引。 - OSS上传失败: - 现象:抛出错误并记录失败原因。 - 排查:确认Region、AccessKey、Bucket、Endpoint配置;检查权限与CDN域名。 - WebSocket连接异常: - 现象:升级失败或客户端断开。 - 排查:确认路径为/ws;检查clientId与客户端状态。 - Sentry未上报: - 现象:未配置DSN时跳过初始化。 - 排查:检查环境变量与采样率设置。 - 限流触发: - 现象:429响应与Retry-After头部。 - 排查:检查限流键生成规则与Redis可用性。 章节来源 - [server/src/services/redis.service.ts:246-255](file://server/src/services/redis.service.ts#L246-L255) - [server/src/services/oss.service.ts:53-56](file://server/src/services/oss.service.ts#L53-L56) - [server/src/services/websocket.service.ts:104-130](file://server/src/services/websocket.service.ts#L104-L130) - [server/src/services/sentry.service.ts:10-13](file://server/src/services/sentry.service.ts#L10-L13) - [server/src/middleware/rate-limiter.ts:60-71](file://server/src/middleware/rate-limiter.ts#L60-L71) ## 结论 该服务基础设施以“服务单例 + 中间件管线”的方式构建,实现了高内聚、低耦合的解耦设计。通过Redis/Bull队列、OSS/本地存储、Sentry监控与WebSocket推送,满足了AI有声书生成平台对异步处理、大规模媒体存储、可观测性与实时性的需求。同时,完善的降级策略(Redis不可用时的内存队列)与中间件体系(认证、安全、性能、限流)提升了系统的鲁棒性与可运维性。 ## 附录 - 启动流程要点: - 初始化Sentry - 连接数据库 - 测试Redis与存储连接 - 初始化WebSocket - 注册路由与中间件 - 启动队列处理器并恢复中断任务 - 注册优雅关闭钩子 章节来源 - [server/src/app.ts:133-192](file://server/src/app.ts#L133-L192) - [server/src/modules/book-generator/book-queue.processor.ts:88-124](file://server/src/modules/book-generator/book-queue.processor.ts#L88-L124)