# 后端服务排查 **本文引用的文件** - [server/src/app.ts](file://server/src/app.ts) - [server/src/middleware/errorHandler.ts](file://server/src/middleware/errorHandler.ts) - [server/src/services/redis.service.ts](file://server/src/services/redis.service.ts) - [server/src/services/queue.service.ts](file://server/src/services/queue.service.ts) - [server/src/middleware/cache.ts](file://server/src/middleware/cache.ts) - [server/src/modules/book-generator/book-queue.processor.ts](file://server/src/modules/book-generator/book-queue.processor.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/src/services/logger.service.ts](file://server/src/services/logger.service.ts) - [server/src/services/sentry.service.ts](file://server/src/services/sentry.service.ts) - [server/src/config/index.ts](file://server/src/config/index.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/services/memory-queue.ts](file://server/src/services/memory-queue.ts) - [server/src/models/index.ts](file://server/src/models/index.ts) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向AI有声书生成平台的后端服务运维与开发人员,聚焦Node.js/Koa.js服务在生产环境中的常见故障场景与排查路径,覆盖API接口异常、数据库连接问题、队列服务故障、Redis缓存异常、中间件错误处理、内存泄漏检测、异步任务处理问题、第三方服务集成故障以及系统资源监控等主题。文档提供日志分析方法、错误码含义解释、性能监控指标与根因分析流程,并给出可视化图示帮助快速定位问题。 ## 项目结构 后端采用Koa应用入口集中初始化,路由按模块拆分,服务层(队列、缓存、日志、Sentry)独立封装,业务控制器与领域服务解耦,整体呈现“路由-控制器-服务-基础设施”的分层架构。 ```mermaid graph TB A["Koa 应用
server/src/app.ts"] --> B["路由注册
各模块控制器"] A --> C["中间件链路
错误处理/安全/性能/缓存"] A --> D["服务层
Redis/队列/日志/Sentry/存储"] B --> E["业务控制器
如 tts.controller.ts / auth.controller.ts"] D --> F["队列服务
queue.service.ts"] D --> G["Redis 服务
redis.service.ts"] D --> H["日志服务
logger.service.ts"] D --> I["Sentry 监控
sentry.service.ts"] D --> J["内存队列回退
memory-queue.ts"] A --> K["数据库连接
models/index.ts"] ``` 图表来源 - [server/src/app.ts:57-130](file://server/src/app.ts#L57-L130) - [server/src/modules/tts/tts.controller.ts:1-274](file://server/src/modules/tts/tts.controller.ts#L1-L274) - [server/src/modules/auth/auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94) - [server/src/services/queue.service.ts:48-342](file://server/src/services/queue.service.ts#L48-L342) - [server/src/services/redis.service.ts:3-271](file://server/src/services/redis.service.ts#L3-L271) - [server/src/services/logger.service.ts:67-114](file://server/src/services/logger.service.ts#L67-L114) - [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43) - [server/src/services/memory-queue.ts:17-119](file://server/src/services/memory-queue.ts#L17-L119) - [server/src/models/index.ts:1-15](file://server/src/models/index.ts#L1-L15) 章节来源 - [server/src/app.ts:57-130](file://server/src/app.ts#L57-L130) ## 核心组件 - 应用入口与中间件栈:统一初始化Sentry、数据库、Redis、存储、WebSocket;注册错误处理、性能监控、HTTP日志、安全防护、CORS、BodyParser、静态文件挂载与路由。 - 队列服务:基于Bull的Redis队列,支持任务排队、并发控制、状态查询、进度回调;Redis不可用时回退至内存队列。 - Redis服务:提供键值、Hash、JSON读写、过期、存在性检查、PING连通性测试与断开;具备重连策略与事件监听。 - 缓存中间件:基于Redis的HTTP响应缓存与清理,支持自定义键生成器与前缀。 - 性能监控中间件:统计总请求数、平均响应时间、慢请求、错误率与端点级指标,并提供指标路由。 - 日志服务:Winston多通道输出,分别记录控制台、错误文件、综合日志、HTTP请求日志。 - Sentry服务:初始化SDK、错误过滤、上下文设置、Koa错误捕获中间件。 - 数据库连接:Prisma客户端连接封装。 - 业务控制器:TTS、认证等模块的API接口,包含参数校验、配额检查、异步任务触发与状态查询。 章节来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) - [server/src/services/queue.service.ts:48-342](file://server/src/services/queue.service.ts#L48-L342) - [server/src/services/redis.service.ts:3-271](file://server/src/services/redis.service.ts#L3-L271) - [server/src/middleware/cache.ts:13-98](file://server/src/middleware/cache.ts#L13-L98) - [server/src/middleware/performance.ts:29-110](file://server/src/middleware/performance.ts#L29-L110) - [server/src/services/logger.service.ts:67-114](file://server/src/services/logger.service.ts#L67-L114) - [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43) - [server/src/models/index.ts:1-15](file://server/src/models/index.ts#L1-L15) - [server/src/modules/tts/tts.controller.ts:12-274](file://server/src/modules/tts/tts.controller.ts#L12-L274) - [server/src/modules/auth/auth.controller.ts:10-94](file://server/src/modules/auth/auth.controller.ts#L10-L94) ## 架构总览 下图展示服务启动、中间件执行、路由处理、队列与缓存交互的关键流程。 ```mermaid sequenceDiagram participant Client as "客户端" participant Koa as "Koa 应用
app.ts" participant MW as "中间件栈
error/performance/cache" participant Router as "路由
controllers" participant Svc as "服务层
Redis/Queue/Logger/Sentry" participant DB as "数据库
Prisma" Client->>Koa : HTTP 请求 Koa->>MW : 错误处理/性能/日志/安全/CORS MW-->>Koa : 通过 Koa->>Router : 路由匹配 Router->>Svc : 业务调用缓存/队列/存储 Router->>DB : 数据库操作 DB-->>Router : 结果 Router-->>Client : 响应 Koa->>Svc : 性能指标/日志/Sentry上报 ``` 图表来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) - [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/cache.ts:13-48](file://server/src/middleware/cache.ts#L13-L48) - [server/src/modules/tts/tts.controller.ts:52-127](file://server/src/modules/tts/tts.controller.ts#L52-L127) - [server/src/models/index.ts:5-13](file://server/src/models/index.ts#L5-L13) ## 详细组件分析 ### 组件A:错误处理与自定义错误类 - 设计要点 - 统一错误捕获与响应格式,支持状态码与业务码分离。 - 提供AppError及子类(未授权、禁止、未找到、请求错误、配额超限)便于语义化抛错。 - 开发环境返回堆栈,生产环境隐藏细节。 - 排查要点 - 检查控制器是否正确抛出自定义错误类。 - 查看错误响应体中的code/status字段,结合日志定位具体模块。 - 关注Sentry错误上报是否生效(需配置DSN)。 ```mermaid classDiagram class AppError { +number code +number status +constructor(message, code, status) } class UnauthorizedError class ForbiddenError class NotFoundError class BadRequestError class QuotaExceededError AppError <|-- UnauthorizedError AppError <|-- ForbiddenError AppError <|-- NotFoundError AppError <|-- BadRequestError AppError <|-- QuotaExceededError ``` 图表来源 - [server/src/middleware/errorHandler.ts:27-67](file://server/src/middleware/errorHandler.ts#L27-L67) 章节来源 - [server/src/middleware/errorHandler.ts:3-67](file://server/src/middleware/errorHandler.ts#L3-L67) ### 组件B:Redis缓存服务 - 设计要点 - 连接重试策略、事件监听(connect/error/close)、可用性标记。 - 提供get/set/getJSON/setJSON/del/delPattern/hset/hget/hgetall/incr/expire/exists等常用操作。 - 提供testConnection与disconnect。 - 排查要点 - 启动日志确认Redis连通性;若不可用,缓存中间件会跳过缓存。 - 检查键空间是否存在、过期策略是否合理、批量删除是否命中模式。 - 观察错误日志中的[Redis]前缀定位失败点。 ```mermaid flowchart TD Start(["进入缓存操作"]) --> CheckAvail["检查Redis可用性"] CheckAvail --> |不可用| SkipCache["跳过缓存,直接请求"] CheckAvail --> |可用| GenKey["生成缓存键"] GenKey --> GetOp["执行GET/HGET/HGETALL"] GetOp --> Hit{"命中?"} Hit --> |是| ReturnCache["返回缓存数据"] Hit --> |否| ExecNext["执行下游请求"] ExecNext --> Save{"状态=200且有body?"} Save --> |是| SetOp["SET/SETEX/SETJSON/HSET"] Save --> |否| End(["结束"]) SetOp --> End SkipCache --> End ``` 图表来源 - [server/src/services/redis.service.ts:43-255](file://server/src/services/redis.service.ts#L43-L255) - [server/src/middleware/cache.ts:13-48](file://server/src/middleware/cache.ts#L13-L48) 章节来源 - [server/src/services/redis.service.ts:3-271](file://server/src/services/redis.service.ts#L3-L271) - [server/src/middleware/cache.ts:13-98](file://server/src/middleware/cache.ts#L13-L98) ### 组件C:队列服务与书籍生成处理器 - 设计要点 - QueueService基于Bull,支持多种队列类型与任务状态;默认移除完成/失败任务以控制Redis占用。 - Redis不可用时回退至MemoryQueue,维持基本并发与处理能力。 - 书籍生成处理器支持Redis或内存两种模式,最大并发3;启动时恢复中断任务。 - 排查要点 - 检查Redis连通性与队列事件(completed/failed/error)日志。 - 使用getTaskStatus查询任务状态与失败原因;关注stalledInterval与maxStalledCount。 - 若出现大量failed,结合Sentry与日志定位具体业务节点。 ```mermaid sequenceDiagram participant Ctrl as "控制器" participant QS as "QueueService" participant RQ as "Redis 队列(Bull)" participant MQ as "内存队列" participant Proc as "书籍生成处理器" participant Store as "书籍状态存储" Ctrl->>QS : addBookGenerationTask(data) alt Redis可用 QS->>RQ : add(data) RQ-->>QS : jobId RQ->>Proc : process(job) Proc->>Store : 更新genStage/progress Proc-->>RQ : 完成/失败 else Redis不可用 QS->>MQ : add(data) MQ->>Proc : process(job) Proc-->>MQ : 完成/失败 end ``` 图表来源 - [server/src/services/queue.service.ts:72-160](file://server/src/services/queue.service.ts#L72-L160) - [server/src/services/memory-queue.ts:26-99](file://server/src/services/memory-queue.ts#L26-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-342](file://server/src/services/queue.service.ts#L48-L342) - [server/src/services/memory-queue.ts:17-119](file://server/src/services/memory-queue.ts#L17-L119) - [server/src/modules/book-generator/book-queue.processor.ts:16-83](file://server/src/modules/book-generator/book-queue.processor.ts#L16-L83) ### 组件D:性能监控与指标路由 - 设计要点 - 记录总请求数、平均响应时间、慢请求阈值(1秒)、端点级统计与错误率。 - 提供/X-Response-Time响应头与/health与/api/metrics路由。 - 排查要点 - 通过/api/metrics查看全局指标与端点错误率,识别异常波动。 - 慢请求告警(>1s)提示可能的数据库慢查询、第三方调用阻塞或CPU瓶颈。 ```mermaid flowchart TD Req["请求进入"] --> StartT["记录开始时间"] StartT --> Next["执行下游处理"] Next --> Done{"完成/异常?"} Done --> |正常| Calc["计算耗时并更新指标"] Done --> |异常| IncErr["错误计数+1"] Calc --> SetHdr["设置X-Response-Time头"] SetHdr --> End["返回响应"] IncErr --> Throw["抛出异常"] ``` 图表来源 - [server/src/middleware/performance.ts:29-76](file://server/src/middleware/performance.ts#L29-L76) - [server/src/app.ts:92-97](file://server/src/app.ts#L92-L97) 章节来源 - [server/src/middleware/performance.ts:19-110](file://server/src/middleware/performance.ts#L19-L110) - [server/src/app.ts:92-97](file://server/src/app.ts#L92-L97) ### 组件E:日志与Sentry监控 - 设计要点 - Winston多通道:Console、错误文件、综合日志、HTTP请求日志;HTTP中间件统一记录请求/错误。 - Sentry初始化、错误过滤(如Redis连接拒绝)、Koa中间件捕获上下文(方法、URL、用户)。 - 排查要点 - 生产环境关注error.log与http.log;开发环境可查看控制台彩色输出。 - 在Sentry中按方法/URL/用户维度聚合错误,结合堆栈定位根因。 章节来源 - [server/src/services/logger.service.ts:67-114](file://server/src/services/logger.service.ts#L67-L114) - [server/src/services/sentry.service.ts:7-113](file://server/src/services/sentry.service.ts#L7-L113) - [server/src/app.ts:133-192](file://server/src/app.ts#L133-L192) ### 组件F:数据库连接与模型 - 设计要点 - Prisma客户端连接封装,统一$connect/$disconnect。 - TTS控制器提供/test-db接口验证连接状态。 - 排查要点 - 启动日志确认MySQL连接成功;/test-db返回连接状态与表计数。 - 数据库异常通常表现为连接超时、事务冲突或索引缺失。 章节来源 - [server/src/models/index.ts:1-15](file://server/src/models/index.ts#L1-L15) - [server/src/modules/tts/tts.controller.ts:34-50](file://server/src/modules/tts/tts.controller.ts#L34-L50) ### 组件G:业务控制器(TTS与认证) - 设计要点 - TTS:音色列表、提供商列表、异步生成、状态查询、预览、批量下载;内置参数校验与配额检查。 - 认证:发送验证码、手机号登录、用户信息查询与更新。 - 排查要点 - 参数校验失败会抛出BadRequestError;未找到资源抛出NotFoundError。 - TTS生成后按字数消耗配额,异常时记录告警。 章节来源 - [server/src/modules/tts/tts.controller.ts:12-274](file://server/src/modules/tts/tts.controller.ts#L12-L274) - [server/src/modules/auth/auth.controller.ts:10-94](file://server/src/modules/auth/auth.controller.ts#L10-L94) ## 依赖关系分析 - 组件耦合 - app.ts集中引入并装配中间件、路由与服务,耦合度低,便于扩展。 - QueueService对RedisService强依赖,MemoryQueue作为降级方案,降低单点风险。 - 控制器仅依赖服务接口,避免直接依赖底层实现。 - 外部依赖 - Redis/Bull用于队列;Winston用于日志;Sentry用于错误监控;Prisma用于数据库访问。 - 循环依赖 - 未见明显循环依赖;模块间通过导出单例服务进行协作。 ```mermaid graph LR App["app.ts"] --> EH["errorHandler.ts"] App --> PM["performance.ts"] App --> CL["cache.ts"] App --> RS["redis.service.ts"] App --> QS["queue.service.ts"] App --> LS["logger.service.ts"] App --> SS["sentry.service.ts"] App --> MD["models/index.ts"] TTS["tts.controller.ts"] --> QS TTS --> RS TTS --> MD AUTH["auth.controller.ts"] --> MD ``` 图表来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) - [server/src/services/queue.service.ts:18-20](file://server/src/services/queue.service.ts#L18-L20) - [server/src/services/redis.service.ts:1-2](file://server/src/services/redis.service.ts#L1-L2) - [server/src/modules/tts/tts.controller.ts:1-5](file://server/src/modules/tts/tts.controller.ts#L1-L5) - [server/src/modules/auth/auth.controller.ts:1-6](file://server/src/modules/auth/auth.controller.ts#L1-L6) 章节来源 - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) ## 性能考量 - 慢请求识别:超过1秒的请求计入慢请求并告警。 - 队列并发:书籍生成最大并发3,避免资源争抢;可根据Redis性能调整。 - 缓存命中:合理TTL与键前缀提升命中率,减少数据库压力。 - 日志级别:生产环境降低控制台冗余,重点保留HTTP与错误日志。 - 监控采样:Sentry在生产环境按比例采样,必要时提高采样率定位问题。 [本节为通用指导,无需列出章节来源] ## 故障排查指南 ### 1) API接口异常 - 现象 - 响应体包含code/status/message/data,业务错误与系统错误区分明确。 - 排查步骤 - 查看控制器是否抛出自定义错误类;核对状态码与业务码。 - 检查Sentry错误面板,按URL/方法/用户聚合定位。 - 开启开发环境堆栈辅助定位。 - 常见错误码 - 400:请求参数错误(如文本为空、音色缺失)。 - 401:未授权访问。 - 403:禁止访问。 - 404:资源不存在(如书籍/音频)。 - 429:使用次数/配额已达上限。 - 500:服务器内部错误。 章节来源 - [server/src/middleware/errorHandler.ts:3-67](file://server/src/middleware/errorHandler.ts#L3-L67) - [server/src/modules/tts/tts.controller.ts:70-96](file://server/src/modules/tts/tts.controller.ts#L70-L96) - [server/src/modules/tts/tts.controller.ts:130-143](file://server/src/modules/tts/tts.controller.ts#L130-L143) ### 2) 数据库连接问题 - 现象 - 启动日志显示MySQL连接状态;/test-db返回连接状态与表计数。 - 排查步骤 - 确认数据库服务可达、凭据正确、网络策略放行。 - 查看Prisma连接异常堆栈;检查慢查询与连接池配置。 - 使用/test-db接口快速验证连通性。 章节来源 - [server/src/models/index.ts:5-13](file://server/src/models/index.ts#L5-L13) - [server/src/modules/tts/tts.controller.ts:34-50](file://server/src/modules/tts/tts.controller.ts#L34-L50) ### 3) 队列服务故障 - 现象 - 队列不可用时回退至内存队列;任务状态查询失败或无进度。 - 排查步骤 - 检查Redis连通性与事件日志;关注completed/failed/error。 - 使用getTaskStatus查询状态与失败原因;核对stalled配置。 - 服务器重启后自动恢复中断任务,观察日志确认恢复数量。 - 降级策略 - Redis不可用时自动切换MemoryQueue,维持基本并发。 章节来源 - [server/src/services/queue.service.ts:53-122](file://server/src/services/queue.service.ts#L53-L122) - [server/src/services/memory-queue.ts:54-99](file://server/src/services/memory-queue.ts#L54-L99) - [server/src/modules/book-generator/book-queue.processor.ts:88-124](file://server/src/modules/book-generator/book-queue.processor.ts#L88-L124) ### 4) Redis缓存异常 - 现象 - 缓存中间件跳过缓存;键不存在或过期;批量删除未命中。 - 排查步骤 - 使用testConnection确认连通性;检查重连策略与事件日志。 - 核对键前缀与生成规则;确认TTL与过期策略。 - 使用delPattern清理相关键空间;观察批量删除日志。 章节来源 - [server/src/services/redis.service.ts:246-255](file://server/src/services/redis.service.ts#L246-L255) - [server/src/middleware/cache.ts:13-48](file://server/src/middleware/cache.ts#L13-L48) ### 5) 中间件错误处理 - 现象 - 统一错误响应;开发环境返回堆栈;生产环境隐藏细节。 - 排查步骤 - 确认errorHandler位于中间件栈首位;检查自定义错误类使用是否规范。 - 关注Sentry中间件是否正确捕获上下文。 章节来源 - [server/src/middleware/errorHandler.ts:3-24](file://server/src/middleware/errorHandler.ts#L3-L24) - [server/src/services/sentry.service.ts:92-110](file://server/src/services/sentry.service.ts#L92-L110) ### 6) 内存泄漏检测 - 建议措施 - 使用Node.js内置heap snapshot与heap profiler;关注定时器、事件监听器与闭包持有。 - 监控进程内存与堆外内存;对长连接(WebSocket)与大对象序列化保持警惕。 - 通过性能中间件识别慢请求,间接定位潜在泄漏点。 [本节为通用指导,无需列出章节来源] ### 7) 异步任务处理问题 - 现象 - 任务长时间处于waiting/active;失败后未恢复;进度回调未触发。 - 排查步骤 - 检查队列并发与Redis可用性;核对任务超时配置。 - 观察书籍生成处理器日志;确认状态更新与失败回写。 - 使用getTaskStatus与onProgress定位问题。 章节来源 - [server/src/services/queue.service.ts:197-237](file://server/src/services/queue.service.ts#L197-L237) - [server/src/modules/book-generator/book-queue.processor.ts:16-43](file://server/src/modules/book-generator/book-queue.processor.ts#L16-L43) ### 8) 第三方服务集成故障 - 现象 - TTS提供商调用失败、限流、余额不足、模型不支持等。 - 排查步骤 - 检查模型配置与自动切换逻辑;根据shouldSwitchModel判定是否需要切换。 - 关注/DASHSCOPE相关配置项与实时模式开关。 - 通过Sentry与日志聚合错误,定位具体供应商与接口。 章节来源 - [server/src/config/index.ts:46-67](file://server/src/config/index.ts#L46-L67) - [server/src/config/index.ts:83-93](file://server/src/config/index.ts#L83-L93) ### 9) 系统资源监控 - 指标建议 - CPU使用率、内存占用、GC暂停时间、打开文件描述符数。 - 队列等待/活跃任务数、Redis内存使用、HTTP请求数与错误率。 - 工具建议 - Node.js Profiler与火焰图;Prometheus/Grafana(可选);容器监控(如Docker stats)。 [本节为通用指导,无需列出章节来源] ## 结论 本排查文档围绕Koa应用的中间件、服务与业务控制器,构建了从启动到运行的全链路故障排查路径。通过统一的错误处理、性能监控、日志与Sentry监控、Redis与队列的可观测性,以及针对TTS与书籍生成的专项流程,可快速定位并解决生产环境中的常见问题。建议在变更发布前进行端到端回归测试,并持续完善监控与告警体系。 [本节为总结性内容,无需列出章节来源] ## 附录 ### A. 常用健康与指标接口 - 健康检查:GET /health - 性能指标:GET /api/metrics 章节来源 - [server/src/app.ts:92-97](file://server/src/app.ts#L92-L97) ### B. 启动流程与优雅关闭 - 启动顺序:Sentry初始化 → 数据库连接 → Redis/存储连通性测试 → 订阅套餐初始化 → WebSocket → 启动HTTP服务 → 初始化书籍生成队列 → 恢复中断任务。 - 优雅关闭:接收SIGTERM/SIGINT,关闭队列与Redis连接后退出。 章节来源 - [server/src/app.ts:133-192](file://server/src/app.ts#L133-L192)