本文引用的文件
本文件面向AI有声书生成平台的服务基础设施,系统性梳理支撑业务模块运行的基础服务组件与中间件体系,覆盖以下主题:
后端采用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
图表来源
章节来源
章节来源
下图展示服务启动与组件交互的关键路径,包括启动顺序、依赖注入与优雅关闭流程。
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优雅关闭
图表来源
书籍生成队列处理器:
启动时恢复中断任务(根据数据库状态)
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 : "回退"
图表来源
章节来源
断线保护:在不可用时返回空/失败,避免阻塞主流程。
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
图表来源
章节来源
本地模式:文件写入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模式委托"
图表来源
章节来源
使用场景:全局错误捕获、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 : 上报完成
图表来源
章节来源
事件推送:广播与定向推送,用于音频/视频生成完成与批量生成进度。
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 : 移除客户端
图表来源
章节来源
限流中间件:基于Redis/Memory的限流器,支持多场景限流策略。
flowchart TD
Req["请求进入"] --> EH["错误处理中间件"]
EH --> PM["性能监控中间件"]
PM --> SEC["安全中间件(XSS/SQL/脱敏)"]
SEC --> AUTH["认证中间件(可选/强制)"]
AUTH --> RL["限流中间件(可插拔)"]
RL --> Route["路由匹配与控制器"]
Route --> RESP["响应返回"]
EH --> |异常| RESP
图表来源
章节来源
章节来源
外部依赖:
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["限流中间件"]
图表来源
章节来源
章节来源
该服务基础设施以“服务单例 + 中间件管线”的方式构建,实现了高内聚、低耦合的解耦设计。通过Redis/Bull队列、OSS/本地存储、Sentry监控与WebSocket推送,满足了AI有声书生成平台对异步处理、大规模媒体存储、可观测性与实时性的需求。同时,完善的降级策略(Redis不可用时的内存队列)与中间件体系(认证、安全、性能、限流)提升了系统的鲁棒性与可运维性。
章节来源