存储机制.md 20 KB

存储机制

本文引用的文件

  • book-generator.store.ts
  • book-generator.types.ts
  • stage-manager.ts
  • index.ts
  • schema.prisma
  • cache.ts
  • redis.service.ts
  • storage.service.ts
  • book-generator.controller.ts
  • 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

    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
    

图表来源

  • book-generator.controller.ts:1-199
  • book-generator.store.ts:1-1073
  • stage-manager.ts:1-202
  • schema.prisma:130-192
  • redis.service.ts:1-53
  • storage.service.ts:1-278

章节来源

  • book-generator.store.ts:1-1073
  • book-generator.types.ts:1-226
  • stage-manager.ts:1-202
  • index.ts:1-15
  • schema.prisma:130-192
  • cache.ts:1-97
  • redis.service.ts:1-53
  • storage.service.ts:1-278
  • book-generator.controller.ts:1-199
  • fault-tolerance.ts:1-388

核心组件

  • 存储类 BookStore:提供书籍、章节、大纲、元数据的CRUD与状态推进;负责将数据库记录转换为领域对象;提供批量创建、章节树构建、发布/取消发布等能力。
  • 阶段管理器 Stage Manager:基于线性阶段模型的安全推进/回退,配合乐观锁与资源清理规则,确保状态迁移合法与幂等。
  • 缓存中间件与Redis:提供HTTP响应缓存、键空间清理、常用查询缓存等能力,降低数据库压力。
  • 统一存储服务 StorageService:抽象OSS与本地存储,支持上传/下载/删除/签名URL等操作,便于切换与测试。
  • 容错与监控 Fault Tolerance:AI调用重试、节点超时控制、进度监控、自动恢复,保障生成任务的稳定性。

章节来源

  • book-generator.store.ts:163-1073
  • stage-manager.ts:100-198
  • cache.ts:13-97
  • redis.service.ts:1-53
  • storage.service.ts:13-278
  • fault-tolerance.ts:67-324

架构总览

存储架构采用“领域服务+数据库+缓存+外部存储”的分层设计:

  • 领域服务(BookStore)封装业务语义与状态机,屏蔽底层细节。
  • 数据库(Prisma + MySQL)持久化书籍、章节、生成阶段、元数据等。
  • 缓存(Redis)用于热点数据与响应缓存,提升读性能。
  • 外部存储(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缓存"
    

图表来源

  • book-generator.controller.ts:24-119
  • book-generator.store.ts:758-897
  • stage-manager.ts:158-198
  • redis.service.ts:52-103
  • storage.service.ts:43-93

详细组件分析

数据类型与存储结构

  • 书籍(Book):包含基础信息、生成阶段、进度、是否发布、章节列表、大纲、元数据、错误信息等。
  • 章节(Chapter):包含章节内容、摘要、字数、生成阶段、生成时间、音频/视频URL与时长、是否公开等。
  • 大纲(BookOutline):树形结构的章/节/小节规划,支持从数据库章节记录重建。
  • 生成阶段(BookGenStage/ChapterGenStage):线性阶段模型,用于统一推进与回退。
  • 任务(GenerateTask):批量生成任务的进度、状态、重试次数等。

章节来源

  • book-generator.types.ts:8-139

数据库模型与字段

  • Book:包含用户ID、标题、副标题、描述、受众、风格、书籍规模、总章节数、预估字数、进度、是否发布、大纲JSON、前言/后记、错误信息、失败阶段、生成阶段、分析结果等。
  • BookChapter:包含书籍ID、父子关系、层级、序号、标题、摘要、关键知识点、预估字数、正文、字数、内容错误、生成时间、音频/视频URL与时长、是否公开、生成阶段、歌词等。
  • VideoProject、Draft、TokenUsage等模型与书籍生成间接相关。

章节来源

  • schema.prisma:130-192

存储类 BookStore 的职责与实现

  • 书籍与章节的创建、查询、更新、删除。
  • 章节树构建:从数据库记录重建大纲树(章→节→小节)。
  • 发布/取消发布:事务性更新书籍与章节公开状态。
  • 音频生成:异步生成并回调更新章节音频URL与时长,推进阶段。
  • 章节内容重生成:LLM调用+清理失败状态+推进阶段。
  • 状态推进与回退:委托阶段管理器执行安全推进/回退与资源清理。

    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
  • stage-manager.ts:100-198

章节来源

  • book-generator.store.ts:244-1073
  • stage-manager.ts:100-198

缓存机制与并发控制

  • 缓存中间件:支持自定义键生成器、命中/未命中标记、TTL控制;当Redis不可用时自动降级。
  • 常用缓存配置:用户信息、音色列表、书籍详情、热门书籍、会员权益等。
  • 并发控制:阶段推进采用乐观锁(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
    

图表来源

  • cache.ts:13-47

章节来源

  • cache.ts:13-97
  • redis.service.ts:43-103

数据持久化与事务处理

  • 数据库连接:PrismaClient初始化与连接管理。
  • 事务:发布/取消发布使用事务,确保书籍与章节状态一致。
  • 乐观锁:阶段推进使用updateMany + 条件字段,失败时查询实际状态并做幂等处理。

章节来源

  • index.ts:5-13
  • book-generator.store.ts:700-754
  • stage-manager.ts:118-146

生命周期管理与数据清理策略

  • 阶段回退清理:当目标阶段低于音频/视频完成阶段时,自动清空对应资源字段(URL/时长)。
  • 任务清理:批量生成任务运行期间占用内存Map,完成后清理。
  • 缓存清理:提供按前缀删除缓存的能力。

章节来源

  • stage-manager.ts:75-92
  • book-generator.controller.ts:15-16

与数据库的交互与一致性

  • 读路径:支持按用户过滤、按公开状态过滤、按发布时间排序;详情页可选择排除章节内容以减少传输。
  • 写路径:统一使用Prisma ORM,事务包裹关键操作;阶段推进采用乐观锁;错误信息写入errorMsg字段便于追踪。
  • 一致性:通过阶段模型与资源清理规则,确保状态与资源的一致性;发布/取消发布事务保证原子性。

章节来源

  • book-generator.store.ts:282-331
  • book-generator.store.ts:700-754
  • stage-manager.ts:118-146

异常处理与重试机制

  • AI调用重试:指数退避,最多3次;失败记录到errorMsg并通知用户。
  • 节点超时:超时后通知用户并尝试自动恢复。
  • 进度监控:长时间无进度发出警告,必要时自动恢复。
  • 音频生成失败:回退到上一阶段并自动重试最多3次。

章节来源

  • fault-tolerance.ts:67-122
  • fault-tolerance.ts:130-179
  • fault-tolerance.ts:187-260
  • book-generator.store.ts:872-896

代码示例(路径指引)

  • 读取书籍详情(含大纲树):getById:282-331
  • 更新章节内容并推进阶段:updateChapter:579-613
  • 生成章节音频并回调更新:generateChapterAudio:759-793
  • 按ID生成音频(带并发保护与重试):generateChapterAudioById:800-897
  • 推进章节阶段(安全推进):advanceChapter:158-179
  • 回退到上游阶段(清理下游资源):regenerateChapter:188-198
  • 发布书籍(事务):publishAlbum:700-714
  • 上传音频文件(OSS/本地):uploadAudio:43-49
  • 缓存中间件使用:createCache:13-47

依赖关系分析

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
  • book-generator.store.ts:1-1073
  • stage-manager.ts:1-202
  • schema.prisma:130-192
  • redis.service.ts:1-53
  • storage.service.ts:1-278
  • fault-tolerance.ts:1-388

章节来源

  • book-generator.store.ts:1-1073
  • stage-manager.ts:1-202
  • schema.prisma:130-192
  • redis.service.ts:1-53
  • storage.service.ts:1-278
  • book-generator.controller.ts:1-199
  • fault-tolerance.ts:1-388

性能考量

  • 读性能
    • 使用Redis缓存热点数据(书籍详情、热门书籍、音色列表等),合理设置TTL。
    • 详情页可选择排除章节内容,减少传输与序列化开销。
  • 写性能
    • 批量创建章节使用upsert,避免重复创建与唯一约束冲突。
    • 阶段推进采用乐观锁,减少锁竞争。
  • I/O与存储
    • 音频/视频等大文件走OSS/本地存储,数据库仅存URL与时长。
    • 上传/下载/签名URL按需使用,避免不必要的网络往返。
  • 并发与一致性
    • 阶段推进严格遵循转移矩阵与乐观锁,避免竞态。
    • 音频生成回调在存储层幂等更新,避免重复写入。

[本节为通用性能建议,无需特定文件引用]

故障排查指南

  • 阶段推进失败
    • 检查当前阶段与目标阶段是否在转移矩阵内;确认乐观锁条件匹配。
    • 若状态已被其他调用改变,查询实际状态并做幂等处理。
  • 音频生成异常
    • 查看errorMsg字段定位失败原因;检查回调是否触发;必要时重试。
    • 若多次失败,回退到上游阶段并自动重试。
  • 缓存问题
    • Redis不可用时会自动降级;可通过clearCache按前缀清理。
    • 检查缓存键生成器与TTL配置是否合理。
  • 数据库连接
    • 确认Prisma连接成功;检查数据库权限与网络连通性。

章节来源

  • stage-manager.ts:100-146
  • book-generator.store.ts:872-896
  • cache.ts:54-61
  • index.ts:5-13

结论

该存储机制以领域服务为核心,结合线性阶段模型、乐观锁与资源清理规则,实现了高一致性与可维护性的数据流;通过Redis缓存与统一存储抽象,兼顾性能与可移植性;借助容错与监控体系,提升了生成任务的稳定性与可观测性。建议在生产环境中持续优化缓存命中率、控制阶段推进频率、规范错误日志与告警策略。

[本节为总结性内容,无需特定文件引用]

附录

常见问题与最佳实践

  • 如何正确推进阶段
    • 使用advanceChapter推进到下一阶段;回退使用regenerateChapter并清理下游资源。
  • 如何避免重复生成
    • 在generateChapterAudioById中先检查当前阶段,若已在目标阶段则跳过。
  • 如何清理缓存
    • 使用clearCache(keyPrefix)按前缀清理;或在写操作后主动清理相关键。
  • 如何切换存储介质
    • 通过环境变量切换STORAGE_TYPE,统一使用storageService的上传/下载接口。

章节来源

  • stage-manager.ts:158-198
  • book-generator.store.ts:800-836
  • cache.ts:54-61
  • storage.service.ts:17-28