服务基础设施.md 23 KB

服务基础设施

本文引用的文件

  • server/src/app.ts
  • server/src/services/redis.service.ts
  • server/src/services/oss.service.ts
  • server/src/services/queue.service.ts
  • server/src/services/sentry.service.ts
  • server/src/services/websocket.service.ts
  • server/src/services/storage.service.ts
  • server/src/services/memory-queue.ts
  • server/src/modules/book-generator/book-queue.processor.ts
  • server/src/middleware/auth.ts
  • server/src/middleware/errorHandler.ts
  • server/src/middleware/security.ts
  • server/src/middleware/performance.ts
  • server/src/middleware/rate-limiter.ts
  • server/src/config/index.ts
  • server/src/types/index.ts
  • server/src/models/index.ts

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向AI有声书生成平台的服务基础设施,系统性梳理支撑业务模块运行的基础服务组件与中间件体系,覆盖以下主题:

  • 队列服务:基于Bull的异步任务处理与降级策略
  • 缓存服务:Redis缓存管理与连接健康检查
  • 存储服务:阿里云OSS与本地存储的统一抽象
  • 日志与监控:Sentry错误监控与性能追踪
  • WebSocket服务:实时事件推送
  • 中间件体系:认证、错误处理、安全、性能监控、限流
  • 类型定义与配置管理
  • 服务启动流程与优雅关闭

项目结构

后端采用Koa应用,按“服务层、中间件、控制器、配置与类型”分层组织;基础设施组件以“服务单例”的形式注入应用生命周期。

graph TB
subgraph "应用层"
APP["Koa 应用<br/>server/src/app.ts"]
ROUTER["路由注册<br/>server/src/app.ts"]
end
subgraph "基础设施服务"
REDIS["Redis 服务<br/>server/src/services/redis.service.ts"]
QUEUE["队列服务(Bull)<br/>server/src/services/queue.service.ts"]
MEMQ["内存队列(Fallback)<br/>server/src/services/memory-queue.ts"]
OSS["OSS 服务<br/>server/src/services/oss.service.ts"]
STORE["存储服务(统一封装)<br/>server/src/services/storage.service.ts"]
WS["WebSocket 服务<br/>server/src/services/websocket.service.ts"]
SENTRY["Sentry 监控<br/>server/src/services/sentry.service.ts"]
end
subgraph "中间件"
AUTH["认证中间件<br/>server/src/middleware/auth.ts"]
ERR["错误处理中间件<br/>server/src/middleware/errorHandler.ts"]
SEC["安全中间件<br/>server/src/middleware/security.ts"]
PERF["性能监控中间件<br/>server/src/middleware/performance.ts"]
RL["限流中间件<br/>server/src/middleware/rate-limiter.ts"]
end
subgraph "业务与配置"
CFG["配置管理<br/>server/src/config/index.ts"]
TYPES["类型定义<br/>server/src/types/index.ts"]
MODELS["数据库连接<br/>server/src/models/index.ts"]
BOOKQ["书籍生成队列处理器<br/>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
  • server/src/services/redis.service.ts:1-274
  • server/src/services/oss.service.ts:1-256
  • server/src/services/queue.service.ts:1-347
  • server/src/services/storage.service.ts:1-278
  • server/src/services/websocket.service.ts:1-136
  • server/src/services/sentry.service.ts:1-113
  • server/src/services/memory-queue.ts:1-119
  • server/src/modules/book-generator/book-queue.processor.ts:1-124
  • server/src/middleware/auth.ts:1-81
  • server/src/middleware/errorHandler.ts:1-67
  • server/src/middleware/security.ts:1-154
  • server/src/middleware/performance.ts:1-110
  • server/src/middleware/rate-limiter.ts:1-120
  • server/src/config/index.ts:1-117
  • server/src/types/index.ts:1-124
  • server/src/models/index.ts:1-15

章节来源

  • server/src/app.ts:1-194

核心组件

  • 队列服务(Bull + Redis/Fallback):负责任务排队、并发控制与状态跟踪,支持Redis队列与内存队列双通道降级。
  • 缓存服务(Redis):提供键值、Hash、计数器等操作,具备连接健康检查与重试策略。
  • 存储服务(OSS + 本地):统一抽象上传/下载/删除/签名URL能力,支持OSS与本地存储无缝切换。
  • 日志与监控(Sentry):初始化错误监控与性能剖析,提供Koa错误处理中间件。
  • WebSocket服务:提供升级握手、客户端连接管理与事件广播,用于实时推送生成结果。
  • 中间件体系:认证、错误处理、安全防护、性能监控、限流。
  • 配置与类型:集中管理模型配置、JWT、端口、上传目录等;定义用户、音频、订单、分页等类型。

章节来源

  • server/src/services/queue.service.ts:1-347
  • server/src/services/redis.service.ts:1-274
  • server/src/services/storage.service.ts:1-278
  • server/src/services/sentry.service.ts:1-113
  • server/src/services/websocket.service.ts:1-136
  • server/src/middleware/auth.ts:1-81
  • server/src/middleware/errorHandler.ts:1-67
  • server/src/middleware/security.ts:1-154
  • server/src/middleware/performance.ts:1-110
  • server/src/middleware/rate-limiter.ts:1-120
  • server/src/config/index.ts:1-117
  • server/src/types/index.ts:1-124

架构总览

下图展示服务启动与组件交互的关键路径,包括启动顺序、依赖注入与优雅关闭流程。

sequenceDiagram
participant Boot as "应用启动<br/>server/src/app.ts"
participant Sentry as "Sentry 初始化<br/>server/src/services/sentry.service.ts"
participant DB as "数据库连接<br/>server/src/models/index.ts"
participant Redis as "Redis 连接<br/>server/src/services/redis.service.ts"
participant Store as "存储服务<br/>server/src/services/storage.service.ts"
participant WS as "WebSocket 初始化<br/>server/src/services/websocket.service.ts"
participant Q as "队列处理器<br/>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
  • server/src/services/sentry.service.ts:7-43
  • server/src/models/index.ts:5-13
  • server/src/services/redis.service.ts:246-255
  • server/src/services/storage.service.ts:252-272
  • server/src/services/websocket.service.ts:102-133
  • server/src/modules/book-generator/book-queue.processor.ts:48-83

详细组件分析

队列服务(Bull + Redis/Fallback)

  • 设计原则:单一职责,仅负责排队与并发控制;失败重试与超时由上层容错与LLM服务处理。
  • 关键能力:
    • 任务类型枚举与状态映射
    • Redis队列创建与事件监听(完成/失败/错误)
    • 任务添加与回退到内存队列
    • 进度更新与回调管理
    • 统计与暂停/恢复/清空队列
  • 书籍生成队列处理器:

    • 优先使用Redis队列,最大并发3
    • 失败时更新书籍状态为failed
    • 启动时恢复中断任务(根据数据库状态)

      classDiagram
      class QueueService {
      -queues : Map
      -progressCallbacks : Map
      -queueAvailable : boolean
      +isQueueAvailable() boolean
      +addTask(queueType, data, options) Promise<string|null>
      +addAudioGenerationTask(data) Promise<string|null>
      +addVideoGenerationTask(data) Promise<string|null>
      +addBookGenerationTask(data) Promise<string|null>
      +getTaskStatus(queueType, jobId) Promise
      +updateProgress(queueType, jobId, progress, data) Promise<void>
      +onProgress(jobId, callback) void
      +clearQueue(queueType) Promise<void>
      +pauseQueue(queueType) Promise<void>
      +resumeQueue(queueType) Promise<void>
      +closeAll() Promise<void>
      }
      class MemoryQueue {
      -jobs : Map
      -waitingJobs : Array
      -processing : Set
      -concurrency : number
      +add(name, data) Promise<string>
      +process(concurrency, handler) void
      +hasPendingJobs() boolean
      +close() Promise<void>
      }
      class BookQueueProcessor {
      +initBookGenerationQueue() void
      +resumeInterruptedTasks() Promise<void>
      }
      QueueService --> MemoryQueue : "回退"
      BookQueueProcessor --> QueueService : "使用"
      BookQueueProcessor --> MemoryQueue : "回退"
      

图表来源

  • server/src/services/queue.service.ts:48-342
  • server/src/services/memory-queue.ts:17-116
  • server/src/modules/book-generator/book-queue.processor.ts:16-83

章节来源

  • server/src/services/queue.service.ts:1-347
  • server/src/services/memory-queue.ts:1-119
  • server/src/modules/book-generator/book-queue.processor.ts:1-124

缓存服务(Redis)

  • 连接与健康:支持重试策略、连接/错误/关闭事件监听;提供可用性检测。
  • 基础操作:字符串、JSON、Hash、计数器、过期、存在性检查。
  • 批量操作:支持通配符批量删除。
  • 断线保护:在不可用时返回空/失败,避免阻塞主流程。

    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

章节来源

  • server/src/services/redis.service.ts:1-274

存储服务(OSS + 本地)

  • 统一接口:上传音频/视频/封面、通用文件上传、Buffer上传、删除、目录删除、下载、签名URL、测试连接。
  • 存储切换:通过环境变量STORAGE_TYPE在OSS与本地之间切换;OSS模式下支持CDN域名与签名URL。
  • 本地模式:文件写入uploads目录,返回静态URL。

    classDiagram
    class StorageService {
    -storageType : StorageType
    +setStorageType(type) void
    +getStorageType() StorageType
    +uploadAudio(localPath, audioId) Promise<string>
    +uploadVideo(localPath, videoId) Promise<string>
    +uploadCover(localPath, bookId) Promise<string>
    +uploadFile(localPath, category, id) Promise<string>
    +uploadBuffer(buffer, objectKey, contentType) Promise<string>
    +deleteFile(url) Promise<void>
    +deleteDirectory(prefix, id) Promise<void>
    +downloadFile(url) Promise<Buffer>
    +getSignedUrl(url, expires) Promise<string>
    +testConnection() Promise<boolean>
    }
    class OSSService {
    +uploadFile(localPath, objectKey) Promise<string>
    +uploadBuffer(buffer, objectKey, contentType) Promise<string>
    +uploadAudio(localPath, audioId) Promise<string>
    +uploadVideo(localPath, videoId) Promise<string>
    +uploadCover(localPath, bookId) Promise<string>
    +deleteFile(objectKey) Promise<void>
    +deleteDirectory(prefix) Promise<void>
    +getSignedUrl(objectKey, expires) Promise<string>
    +downloadFile(objectKey) Promise<Buffer>
    +getFileUrl(objectKey) string
    +testConnection() Promise<boolean>
    }
    StorageService --> OSSService : "OSS模式委托"
    

图表来源

  • server/src/services/storage.service.ts:13-277
  • server/src/services/oss.service.ts:13-256

章节来源

  • server/src/services/storage.service.ts:1-278
  • server/src/services/oss.service.ts:1-256

日志与监控(Sentry)

  • 初始化:根据环境变量DSN启用,设置采样率与性能剖析集成;提供错误过滤策略。
  • 上下文:设置用户、标签、额外上下文;提供Koa错误处理中间件。
  • 使用场景:全局错误捕获、API异常上报、性能采样。

    sequenceDiagram
    participant App as "应用启动<br/>server/src/app.ts"
    participant Sentry as "Sentry 初始化<br/>server/src/services/sentry.service.ts"
    participant Koa as "Koa 中间件链<br/>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
  • server/src/services/sentry.service.ts:7-43
  • server/src/services/sentry.service.ts:92-110

章节来源

  • server/src/services/sentry.service.ts:1-113
  • server/src/app.ts:133-137

WebSocket服务(实时通信)

  • 升级握手:仅接受/ws路径,从查询参数提取clientId并建立连接。
  • 客户端管理:Map维护clientId到WebSocket实例映射,支持添加/移除。
  • 事件推送:广播与定向推送,用于音频/视频生成完成与批量生成进度。

    sequenceDiagram
    participant Client as "客户端"
    participant Server as "HTTP服务器<br/>server/src/app.ts"
    participant WS as "WebSocket服务<br/>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
  • server/src/services/websocket.service.ts:102-133

章节来源

  • server/src/services/websocket.service.ts:1-136
  • server/src/app.ts:156-157

中间件体系

  • 认证中间件:支持可选认证与强制认证,校验JWT并注入用户信息。
  • 错误处理中间件:统一捕获异常,返回标准化错误响应。
  • 安全中间件:XSS过滤、SQL注入检测、敏感数据脱敏。
  • 性能监控中间件:统计总请求数、平均响应时间、慢请求、错误率与端点级指标。
  • 限流中间件:基于Redis/Memory的限流器,支持多场景限流策略。

    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
  • server/src/middleware/errorHandler.ts:3-24
  • server/src/middleware/performance.ts:29-76
  • server/src/middleware/security.ts:7-27
  • server/src/middleware/auth.ts:7-18
  • server/src/middleware/rate-limiter.ts:49-72

章节来源

  • server/src/middleware/auth.ts:1-81
  • server/src/middleware/errorHandler.ts:1-67
  • server/src/middleware/security.ts:1-154
  • server/src/middleware/performance.ts:1-110
  • server/src/middleware/rate-limiter.ts:1-120

类型定义与配置管理

  • 类型定义:用户、音频、订单、分页、音色、会员配额等;扩展Koa Context以携带用户信息。
  • 配置管理:加载.env,聚合模型配置,提供模型切换策略与默认值;JWT密钥与TTS参数等。

章节来源

  • server/src/types/index.ts:1-124
  • server/src/config/index.ts:1-117

依赖关系分析

  • 组件耦合:
    • 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(限流)等。

      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
  • server/src/services/storage.service.ts:6
  • server/src/app.ts:64-75

章节来源

  • server/src/services/queue.service.ts:1-347
  • server/src/services/storage.service.ts:1-278
  • server/src/app.ts:1-194

性能考量

  • 队列并发:书籍生成队列最大并发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
  • server/src/services/oss.service.ts:53-56
  • server/src/services/websocket.service.ts:104-130
  • server/src/services/sentry.service.ts:10-13
  • server/src/middleware/rate-limiter.ts:60-71

结论

该服务基础设施以“服务单例 + 中间件管线”的方式构建,实现了高内聚、低耦合的解耦设计。通过Redis/Bull队列、OSS/本地存储、Sentry监控与WebSocket推送,满足了AI有声书生成平台对异步处理、大规模媒体存储、可观测性与实时性的需求。同时,完善的降级策略(Redis不可用时的内存队列)与中间件体系(认证、安全、性能、限流)提升了系统的鲁棒性与可运维性。

附录

  • 启动流程要点:
    • 初始化Sentry
    • 连接数据库
    • 测试Redis与存储连接
    • 初始化WebSocket
    • 注册路由与中间件
    • 启动队列处理器并恢复中断任务
    • 注册优雅关闭钩子

章节来源

  • server/src/app.ts:133-192
  • server/src/modules/book-generator/book-queue.processor.ts:88-124