本文引用的文件
本文件系统性阐述“书籍生成”模块的存储机制设计与实现,覆盖数据存储策略、缓存机制、持久化方案、数据生命周期与清理策略、并发访问控制、与数据库的交互与事务处理、数据一致性保障、异常处理与重试机制,以及性能优化与最佳实践。读者可据此理解如何读取/更新存储数据、如何处理异常、如何进行性能优化与运维。
围绕“书籍生成”的存储相关文件主要分布在以下位置:
容错与监控:server/src/modules/book-generator/fault-tolerance.ts
graph TB
subgraph "应用层"
C["book-generator.controller.ts<br/>路由与任务编排"]
end
subgraph "业务层"
S["book-generator.store.ts<br/>存储接口与领域逻辑"]
SM["stage-manager.ts<br/>阶段安全推进/回退"]
FT["fault-tolerance.ts<br/>重试/超时/监控"]
end
subgraph "基础设施"
PRISMA["schema.prisma<br/>数据库模型"]
DB["MySQL<br/>PrismaClient"]
REDIS["Redis<br/>缓存"]
OSS["OSS/本地存储<br/>storage.service.ts"]
end
C --> S
S --> SM
S --> PRISMA
PRISMA --> DB
C --> REDIS
S --> REDIS
S --> OSS
FT --> S
图表来源
章节来源
章节来源
存储架构采用“领域服务+数据库+缓存+外部存储”的分层设计:
外部存储(OSS/本地)用于音频/视频/封面等大文件的落地与访问。
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "控制器<br/>book-generator.controller.ts"
participant Store as "存储服务<br/>book-generator.store.ts"
participant Stage as "阶段管理<br/>stage-manager.ts"
participant DB as "数据库<br/>Prisma/MySQL"
participant Cache as "缓存<br/>Redis"
participant OSS as "存储服务<br/>storage.service.ts"
Client->>Ctrl : "POST /api/book-generator/books/ : id/batch-generate"
Ctrl->>Store : "创建批量生成任务"
Store->>DB : "查询/更新书籍与章节状态"
Store->>Stage : "推进章节状态安全推进"
Store->>OSS : "生成音频并上传"
OSS-->>Store : "返回URL"
Store->>DB : "写入音频URL/时长/阶段"
Store-->>Ctrl : "任务信息"
Ctrl-->>Client : "任务已启动"
Note over Cache,DB : "读路径可命中Redis缓存"
图表来源
章节来源
章节来源
状态推进与回退:委托阶段管理器执行安全推进/回退与资源清理。
classDiagram
class BookStore {
+create(data)
+getById(id, filterPublic, userId)
+getAllByUser(userId, includePublic)
+getPublicBooks()
+update(id, data)
+delete(id)
+createChapter(data)
+createChapters(bookId, chapters)
+createChapterItem(bookIdNum, item, parentId, level)
+createChapterItems(bookIdNum, items, parentId, level)
+updateChapter(bookId, number, data)
+updateChapterById(id, data)
+getChapters(bookId)
+getChapterTree(bookId)
+countCompletedChapters(bookId)
+publishAlbum(bookId)
+unpublishAlbum(bookId)
+togglePublish(bookId)
+generateChapterAudio(bookId, chapterNumber, userId)
+generateChapterAudioById(chapterId, userId)
+generateSingleChapterContent(bookId, chapterId)
-toBook(dbBook, excludeContent)
-buildOutlineFromChapters(chapters)
}
class StageManager {
+advanceChapter(chapterId, targetStage)
+regenerateChapter(chapterId, targetStage)
+safeTransitionChapter(chapterId, currentStage, targetStage)
+getCleanupForChapterRegression(targetStage)
}
BookStore --> StageManager : "推进/回退阶段"
图表来源
章节来源
并发控制:阶段推进采用乐观锁(updateMany + genStage条件),避免竞态;音频生成回调在存储层内幂等更新。
flowchart TD
Start(["进入缓存中间件"]) --> CheckRedis["Redis可用?"]
CheckRedis --> |否| Next["直接执行请求"]
CheckRedis --> |是| GenKey["生成缓存键"]
GenKey --> GetCache["Redis GET"]
GetCache --> Hit{"命中?"}
Hit --> |是| ReturnCache["返回缓存并设置X-Cache: HIT"]
Hit --> |否| ExecReq["执行请求"]
ExecReq --> RespOK{"状态码==200且有body?"}
RespOK --> |是| SetCache["Redis SET TTL"]
RespOK --> |否| SkipCache["跳过缓存"]
SetCache --> ReturnResp["返回响应并设置X-Cache: MISS"]
SkipCache --> ReturnResp
Next --> ReturnResp
图表来源
章节来源
章节来源
章节来源
章节来源
章节来源
graph LR
CTRL["book-generator.controller.ts"] --> STORE["book-generator.store.ts"]
STORE --> STAGE["stage-manager.ts"]
STORE --> PRISMA["schema.prisma"]
PRISMA --> MYSQL["MySQL"]
CTRL --> REDIS["redis.service.ts"]
STORE --> REDIS
STORE --> OSS["storage.service.ts"]
FT["fault-tolerance.ts"] --> STORE
图表来源
章节来源
[本节为通用性能建议,无需特定文件引用]
章节来源
该存储机制以领域服务为核心,结合线性阶段模型、乐观锁与资源清理规则,实现了高一致性与可维护性的数据流;通过Redis缓存与统一存储抽象,兼顾性能与可移植性;借助容错与监控体系,提升了生成任务的稳定性与可观测性。建议在生产环境中持续优化缓存命中率、控制阶段推进频率、规范错误日志与告警策略。
[本节为总结性内容,无需特定文件引用]
章节来源