# 存储机制
**本文引用的文件**
- [book-generator.store.ts](file://server/src/modules/book-generator/book-generator.store.ts)
- [book-generator.types.ts](file://server/src/modules/book-generator/book-generator.types.ts)
- [stage-manager.ts](file://server/src/modules/book-generator/stage-manager.ts)
- [index.ts](file://server/src/models/index.ts)
- [schema.prisma](file://server/prisma/schema.prisma)
- [cache.ts](file://server/src/middleware/cache.ts)
- [redis.service.ts](file://server/src/services/redis.service.ts)
- [storage.service.ts](file://server/src/services/storage.service.ts)
- [book-generator.controller.ts](file://server/src/modules/book-generator/book-generator.controller.ts)
- [fault-tolerance.ts](file://server/src/modules/book-generator/fault-tolerance.ts)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件系统性阐述“书籍生成”模块的存储机制设计与实现,覆盖数据存储策略、缓存机制、持久化方案、数据生命周期与清理策略、并发访问控制、与数据库的交互与事务处理、数据一致性保障、异常处理与重试机制,以及性能优化与最佳实践。读者可据此理解如何读取/更新存储数据、如何处理异常、如何进行性能优化与运维。
## 项目结构
围绕“书籍生成”的存储相关文件主要分布在以下位置:
- 存储实现:server/src/modules/book-generator/book-generator.store.ts
- 类型定义:server/src/modules/book-generator/book-generator.types.ts
- 阶段管理与状态机:server/src/modules/book-generator/stage-manager.ts
- 数据库连接与Prisma:server/src/models/index.ts、server/prisma/schema.prisma
- 缓存中间件与Redis:server/src/middleware/cache.ts、server/src/services/redis.service.ts
- 统一存储服务(OSS/本地):server/src/services/storage.service.ts
- 控制器入口:server/src/modules/book-generator/book-generator.controller.ts
- 容错与监控:server/src/modules/book-generator/fault-tolerance.ts
```mermaid
graph TB
subgraph "应用层"
C["book-generator.controller.ts
路由与任务编排"]
end
subgraph "业务层"
S["book-generator.store.ts
存储接口与领域逻辑"]
SM["stage-manager.ts
阶段安全推进/回退"]
FT["fault-tolerance.ts
重试/超时/监控"]
end
subgraph "基础设施"
PRISMA["schema.prisma
数据库模型"]
DB["MySQL
PrismaClient"]
REDIS["Redis
缓存"]
OSS["OSS/本地存储
storage.service.ts"]
end
C --> S
S --> SM
S --> PRISMA
PRISMA --> DB
C --> REDIS
S --> REDIS
S --> OSS
FT --> S
```
图表来源
- [book-generator.controller.ts:1-199](file://server/src/modules/book-generator/book-generator.controller.ts#L1-L199)
- [book-generator.store.ts:1-1073](file://server/src/modules/book-generator/book-generator.store.ts#L1-L1073)
- [stage-manager.ts:1-202](file://server/src/modules/book-generator/stage-manager.ts#L1-L202)
- [schema.prisma:130-192](file://server/prisma/schema.prisma#L130-L192)
- [redis.service.ts:1-53](file://server/src/services/redis.service.ts#L1-L53)
- [storage.service.ts:1-278](file://server/src/services/storage.service.ts#L1-L278)
章节来源
- [book-generator.store.ts:1-1073](file://server/src/modules/book-generator/book-generator.store.ts#L1-L1073)
- [book-generator.types.ts:1-226](file://server/src/modules/book-generator/book-generator.types.ts#L1-L226)
- [stage-manager.ts:1-202](file://server/src/modules/book-generator/stage-manager.ts#L1-L202)
- [index.ts:1-15](file://server/src/models/index.ts#L1-L15)
- [schema.prisma:130-192](file://server/prisma/schema.prisma#L130-L192)
- [cache.ts:1-97](file://server/src/middleware/cache.ts#L1-L97)
- [redis.service.ts:1-53](file://server/src/services/redis.service.ts#L1-L53)
- [storage.service.ts:1-278](file://server/src/services/storage.service.ts#L1-L278)
- [book-generator.controller.ts:1-199](file://server/src/modules/book-generator/book-generator.controller.ts#L1-L199)
- [fault-tolerance.ts:1-388](file://server/src/modules/book-generator/fault-tolerance.ts#L1-L388)
## 核心组件
- 存储类 BookStore:提供书籍、章节、大纲、元数据的CRUD与状态推进;负责将数据库记录转换为领域对象;提供批量创建、章节树构建、发布/取消发布等能力。
- 阶段管理器 Stage Manager:基于线性阶段模型的安全推进/回退,配合乐观锁与资源清理规则,确保状态迁移合法与幂等。
- 缓存中间件与Redis:提供HTTP响应缓存、键空间清理、常用查询缓存等能力,降低数据库压力。
- 统一存储服务 StorageService:抽象OSS与本地存储,支持上传/下载/删除/签名URL等操作,便于切换与测试。
- 容错与监控 Fault Tolerance:AI调用重试、节点超时控制、进度监控、自动恢复,保障生成任务的稳定性。
章节来源
- [book-generator.store.ts:163-1073](file://server/src/modules/book-generator/book-generator.store.ts#L163-L1073)
- [stage-manager.ts:100-198](file://server/src/modules/book-generator/stage-manager.ts#L100-L198)
- [cache.ts:13-97](file://server/src/middleware/cache.ts#L13-L97)
- [redis.service.ts:1-53](file://server/src/services/redis.service.ts#L1-L53)
- [storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278)
- [fault-tolerance.ts:67-324](file://server/src/modules/book-generator/fault-tolerance.ts#L67-L324)
## 架构总览
存储架构采用“领域服务+数据库+缓存+外部存储”的分层设计:
- 领域服务(BookStore)封装业务语义与状态机,屏蔽底层细节。
- 数据库(Prisma + MySQL)持久化书籍、章节、生成阶段、元数据等。
- 缓存(Redis)用于热点数据与响应缓存,提升读性能。
- 外部存储(OSS/本地)用于音频/视频/封面等大文件的落地与访问。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "控制器
book-generator.controller.ts"
participant Store as "存储服务
book-generator.store.ts"
participant Stage as "阶段管理
stage-manager.ts"
participant DB as "数据库
Prisma/MySQL"
participant Cache as "缓存
Redis"
participant OSS as "存储服务
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缓存"
```
图表来源
- [book-generator.controller.ts:24-119](file://server/src/modules/book-generator/book-generator.controller.ts#L24-L119)
- [book-generator.store.ts:758-897](file://server/src/modules/book-generator/book-generator.store.ts#L758-L897)
- [stage-manager.ts:158-198](file://server/src/modules/book-generator/stage-manager.ts#L158-L198)
- [redis.service.ts:52-103](file://server/src/services/redis.service.ts#L52-L103)
- [storage.service.ts:43-93](file://server/src/services/storage.service.ts#L43-L93)
## 详细组件分析
### 数据类型与存储结构
- 书籍(Book):包含基础信息、生成阶段、进度、是否发布、章节列表、大纲、元数据、错误信息等。
- 章节(Chapter):包含章节内容、摘要、字数、生成阶段、生成时间、音频/视频URL与时长、是否公开等。
- 大纲(BookOutline):树形结构的章/节/小节规划,支持从数据库章节记录重建。
- 生成阶段(BookGenStage/ChapterGenStage):线性阶段模型,用于统一推进与回退。
- 任务(GenerateTask):批量生成任务的进度、状态、重试次数等。
章节来源
- [book-generator.types.ts:8-139](file://server/src/modules/book-generator/book-generator.types.ts#L8-L139)
### 数据库模型与字段
- Book:包含用户ID、标题、副标题、描述、受众、风格、书籍规模、总章节数、预估字数、进度、是否发布、大纲JSON、前言/后记、错误信息、失败阶段、生成阶段、分析结果等。
- BookChapter:包含书籍ID、父子关系、层级、序号、标题、摘要、关键知识点、预估字数、正文、字数、内容错误、生成时间、音频/视频URL与时长、是否公开、生成阶段、歌词等。
- VideoProject、Draft、TokenUsage等模型与书籍生成间接相关。
章节来源
- [schema.prisma:130-192](file://server/prisma/schema.prisma#L130-L192)
### 存储类 BookStore 的职责与实现
- 书籍与章节的创建、查询、更新、删除。
- 章节树构建:从数据库记录重建大纲树(章→节→小节)。
- 发布/取消发布:事务性更新书籍与章节公开状态。
- 音频生成:异步生成并回调更新章节音频URL与时长,推进阶段。
- 章节内容重生成:LLM调用+清理失败状态+推进阶段。
- 状态推进与回退:委托阶段管理器执行安全推进/回退与资源清理。
```mermaid
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 : "推进/回退阶段"
```
图表来源
- [book-generator.store.ts:163-1073](file://server/src/modules/book-generator/book-generator.store.ts#L163-L1073)
- [stage-manager.ts:100-198](file://server/src/modules/book-generator/stage-manager.ts#L100-L198)
章节来源
- [book-generator.store.ts:244-1073](file://server/src/modules/book-generator/book-generator.store.ts#L244-L1073)
- [stage-manager.ts:100-198](file://server/src/modules/book-generator/stage-manager.ts#L100-L198)
### 缓存机制与并发控制
- 缓存中间件:支持自定义键生成器、命中/未命中标记、TTL控制;当Redis不可用时自动降级。
- 常用缓存配置:用户信息、音色列表、书籍详情、热门书籍、会员权益等。
- 并发控制:阶段推进采用乐观锁(updateMany + genStage条件),避免竞态;音频生成回调在存储层内幂等更新。
```mermaid
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
```
图表来源
- [cache.ts:13-47](file://server/src/middleware/cache.ts#L13-L47)
章节来源
- [cache.ts:13-97](file://server/src/middleware/cache.ts#L13-L97)
- [redis.service.ts:43-103](file://server/src/services/redis.service.ts#L43-L103)
### 数据持久化与事务处理
- 数据库连接:PrismaClient初始化与连接管理。
- 事务:发布/取消发布使用事务,确保书籍与章节状态一致。
- 乐观锁:阶段推进使用updateMany + 条件字段,失败时查询实际状态并做幂等处理。
章节来源
- [index.ts:5-13](file://server/src/models/index.ts#L5-L13)
- [book-generator.store.ts:700-754](file://server/src/modules/book-generator/book-generator.store.ts#L700-L754)
- [stage-manager.ts:118-146](file://server/src/modules/book-generator/stage-manager.ts#L118-L146)
### 生命周期管理与数据清理策略
- 阶段回退清理:当目标阶段低于音频/视频完成阶段时,自动清空对应资源字段(URL/时长)。
- 任务清理:批量生成任务运行期间占用内存Map,完成后清理。
- 缓存清理:提供按前缀删除缓存的能力。
章节来源
- [stage-manager.ts:75-92](file://server/src/modules/book-generator/stage-manager.ts#L75-L92)
- [book-generator.controller.ts:15-16](file://server/src/modules/book-generator/book-generator.controller.ts#L15-L16)
### 与数据库的交互与一致性
- 读路径:支持按用户过滤、按公开状态过滤、按发布时间排序;详情页可选择排除章节内容以减少传输。
- 写路径:统一使用Prisma ORM,事务包裹关键操作;阶段推进采用乐观锁;错误信息写入errorMsg字段便于追踪。
- 一致性:通过阶段模型与资源清理规则,确保状态与资源的一致性;发布/取消发布事务保证原子性。
章节来源
- [book-generator.store.ts:282-331](file://server/src/modules/book-generator/book-generator.store.ts#L282-L331)
- [book-generator.store.ts:700-754](file://server/src/modules/book-generator/book-generator.store.ts#L700-L754)
- [stage-manager.ts:118-146](file://server/src/modules/book-generator/stage-manager.ts#L118-L146)
### 异常处理与重试机制
- AI调用重试:指数退避,最多3次;失败记录到errorMsg并通知用户。
- 节点超时:超时后通知用户并尝试自动恢复。
- 进度监控:长时间无进度发出警告,必要时自动恢复。
- 音频生成失败:回退到上一阶段并自动重试最多3次。
章节来源
- [fault-tolerance.ts:67-122](file://server/src/modules/book-generator/fault-tolerance.ts#L67-L122)
- [fault-tolerance.ts:130-179](file://server/src/modules/book-generator/fault-tolerance.ts#L130-L179)
- [fault-tolerance.ts:187-260](file://server/src/modules/book-generator/fault-tolerance.ts#L187-L260)
- [book-generator.store.ts:872-896](file://server/src/modules/book-generator/book-generator.store.ts#L872-L896)
### 代码示例(路径指引)
- 读取书籍详情(含大纲树):[getById:282-331](file://server/src/modules/book-generator/book-generator.store.ts#L282-L331)
- 更新章节内容并推进阶段:[updateChapter:579-613](file://server/src/modules/book-generator/book-generator.store.ts#L579-L613)
- 生成章节音频并回调更新:[generateChapterAudio:759-793](file://server/src/modules/book-generator/book-generator.store.ts#L759-L793)
- 按ID生成音频(带并发保护与重试):[generateChapterAudioById:800-897](file://server/src/modules/book-generator/book-generator.store.ts#L800-L897)
- 推进章节阶段(安全推进):[advanceChapter:158-179](file://server/src/modules/book-generator/stage-manager.ts#L158-L179)
- 回退到上游阶段(清理下游资源):[regenerateChapter:188-198](file://server/src/modules/book-generator/stage-manager.ts#L188-L198)
- 发布书籍(事务):[publishAlbum:700-714](file://server/src/modules/book-generator/book-generator.store.ts#L700-L714)
- 上传音频文件(OSS/本地):[uploadAudio:43-49](file://server/src/services/storage.service.ts#L43-L49)
- 缓存中间件使用:[createCache:13-47](file://server/src/middleware/cache.ts#L13-L47)
## 依赖关系分析
```mermaid
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
```
图表来源
- [book-generator.controller.ts:1-199](file://server/src/modules/book-generator/book-generator.controller.ts#L1-L199)
- [book-generator.store.ts:1-1073](file://server/src/modules/book-generator/book-generator.store.ts#L1-L1073)
- [stage-manager.ts:1-202](file://server/src/modules/book-generator/stage-manager.ts#L1-L202)
- [schema.prisma:130-192](file://server/prisma/schema.prisma#L130-L192)
- [redis.service.ts:1-53](file://server/src/services/redis.service.ts#L1-L53)
- [storage.service.ts:1-278](file://server/src/services/storage.service.ts#L1-L278)
- [fault-tolerance.ts:1-388](file://server/src/modules/book-generator/fault-tolerance.ts#L1-L388)
章节来源
- [book-generator.store.ts:1-1073](file://server/src/modules/book-generator/book-generator.store.ts#L1-L1073)
- [stage-manager.ts:1-202](file://server/src/modules/book-generator/stage-manager.ts#L1-L202)
- [schema.prisma:130-192](file://server/prisma/schema.prisma#L130-L192)
- [redis.service.ts:1-53](file://server/src/services/redis.service.ts#L1-L53)
- [storage.service.ts:1-278](file://server/src/services/storage.service.ts#L1-L278)
- [book-generator.controller.ts:1-199](file://server/src/modules/book-generator/book-generator.controller.ts#L1-L199)
- [fault-tolerance.ts:1-388](file://server/src/modules/book-generator/fault-tolerance.ts#L1-L388)
## 性能考量
- 读性能
- 使用Redis缓存热点数据(书籍详情、热门书籍、音色列表等),合理设置TTL。
- 详情页可选择排除章节内容,减少传输与序列化开销。
- 写性能
- 批量创建章节使用upsert,避免重复创建与唯一约束冲突。
- 阶段推进采用乐观锁,减少锁竞争。
- I/O与存储
- 音频/视频等大文件走OSS/本地存储,数据库仅存URL与时长。
- 上传/下载/签名URL按需使用,避免不必要的网络往返。
- 并发与一致性
- 阶段推进严格遵循转移矩阵与乐观锁,避免竞态。
- 音频生成回调在存储层幂等更新,避免重复写入。
[本节为通用性能建议,无需特定文件引用]
## 故障排查指南
- 阶段推进失败
- 检查当前阶段与目标阶段是否在转移矩阵内;确认乐观锁条件匹配。
- 若状态已被其他调用改变,查询实际状态并做幂等处理。
- 音频生成异常
- 查看errorMsg字段定位失败原因;检查回调是否触发;必要时重试。
- 若多次失败,回退到上游阶段并自动重试。
- 缓存问题
- Redis不可用时会自动降级;可通过clearCache按前缀清理。
- 检查缓存键生成器与TTL配置是否合理。
- 数据库连接
- 确认Prisma连接成功;检查数据库权限与网络连通性。
章节来源
- [stage-manager.ts:100-146](file://server/src/modules/book-generator/stage-manager.ts#L100-L146)
- [book-generator.store.ts:872-896](file://server/src/modules/book-generator/book-generator.store.ts#L872-L896)
- [cache.ts:54-61](file://server/src/middleware/cache.ts#L54-L61)
- [index.ts:5-13](file://server/src/models/index.ts#L5-L13)
## 结论
该存储机制以领域服务为核心,结合线性阶段模型、乐观锁与资源清理规则,实现了高一致性与可维护性的数据流;通过Redis缓存与统一存储抽象,兼顾性能与可移植性;借助容错与监控体系,提升了生成任务的稳定性与可观测性。建议在生产环境中持续优化缓存命中率、控制阶段推进频率、规范错误日志与告警策略。
[本节为总结性内容,无需特定文件引用]
## 附录
### 常见问题与最佳实践
- 如何正确推进阶段
- 使用advanceChapter推进到下一阶段;回退使用regenerateChapter并清理下游资源。
- 如何避免重复生成
- 在generateChapterAudioById中先检查当前阶段,若已在目标阶段则跳过。
- 如何清理缓存
- 使用clearCache(keyPrefix)按前缀清理;或在写操作后主动清理相关键。
- 如何切换存储介质
- 通过环境变量切换STORAGE_TYPE,统一使用storageService的上传/下载接口。
章节来源
- [stage-manager.ts:158-198](file://server/src/modules/book-generator/stage-manager.ts#L158-L198)
- [book-generator.store.ts:800-836](file://server/src/modules/book-generator/book-generator.store.ts#L800-L836)
- [cache.ts:54-61](file://server/src/middleware/cache.ts#L54-L61)
- [storage.service.ts:17-28](file://server/src/services/storage.service.ts#L17-L28)