第 13 章 · Storage 存储层
本章目标:理解 Mastra 存储的领域(domain)模型,学会为不同场景选择 LibSQL/Postgres 等适配器并持久化 workflow 状态。
13.1 存储是什么
Storage 是 Mastra 运行时的持久化层。进程重启后依然可用的数据都由它保管:
- Memory:消息历史、threads、resources、working memory;
- Workflows:suspend/resume 所需的持久化快照;
- Observability:traces、spans、metrics、logs、feedback;
- Evals:分数、数据集、实验结果;
- 后台任务与调度:background tasks、schedules、threadState。
默认是内存存储
不配置 storage 时 Mastra 使用 in-memory store——适合测试和短期实验,但进程退出即丢数据。
13.2 领域模型
存储按 domain 组织,每个适配器实现一个或多个领域:
| Domain | 存什么 |
|---|---|
memory | 线程、消息、资源、working memory |
workflows | workflow 挂起/恢复的快照 |
observability | 追踪、指标、日志 |
scores / datasets / experiments | 评估相关数据 |
backgroundTasks / schedules / threadState | 后台任务与调度状态 |
选型原则:memory 这类高频事务读写选 LibSQL/PostgreSQL;分析型查询选列式或专门后端。
13.3 配置 LibSQL(开发与中小生产)
typescript
// src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { LibSQLStore } from '@mastra/libsql'
export const mastra = new Mastra({
storage: new LibSQLStore({
// 本地文件;生产可换成 libsql:// 远程实例(Turso)
url: process.env.NODE_ENV === 'production'
? process.env.LIBSQL_URL!
: 'file:./mastra.db',
authToken: process.env.LIBSQL_AUTH_TOKEN, // 远程实例需要
}),
agents: { support: supportAgent },
workflows: { refundFlow },
})13.4 配置 Postgres(大规模生产)
typescript
// src/mastra/storage.ts
import { MastraStorage } from '@mastra/core/storage'
import { PgStore } from '@mastra/pg'
export const storage: MastraStorage = new PgStore({
id: 'main-storage',
connectionString: process.env.DATABASE_URL,
// 可选:指定 schema 名实现多环境隔离
schemaName: 'mastra_prod',
})13.5 测试环境的内存存储
单测不需要落盘——显式声明内存存储,跑完即弃:
typescript
// tests/setup.ts
import { Mastra } from '@mastra/core'
import { InMemoryStore } from '@mastra/core/storage'
export const testMastra = new Mastra({
// 隔离且零残留,每个测试实例互不干扰
storage: new InMemoryStore(),
agents: { support: supportAgent },
})13.6 Workflow 状态持久化验证
13.5 Workflow 状态持久化验证
typescript
// src/verify-persistence.ts
import { mastra } from './mastra'
// 启动一个含 suspend 的 workflow 后 kill 进程,
// 重启后用相同 runId resume——状态从存储中恢复
const run = await mastra.getWorkflow('refundFlow').createRunAsync()
const result = await run.start({ inputData: { orderId: 'A-1001' } })
console.log(result.status) // 'suspended'(等待审批)
// 进程重启后:
// const resumed = await run.resume({ resumeData: { approved: true } })本章小结
- Storage 是 memory/workflows/observability/evals 的统一持久化层;
- 默认内存存储仅适合测试,生产必须配置持久适配器;
- LibSQL(本地文件或 Turso)适合开发与中小规模,Postgres 适合大规模;
- workflow 的 suspend/resume 依赖存储快照,重启后可无缝恢复。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. 不配置 storage 时 Mastra 使用什么存储?
2. 以下哪项不是 Mastra storage 管理的数据?
3. workflow 的 suspend/resume 机制依赖存储层的什么能力?
4. memory domain 的读写特点决定了它适合哪类后端?
🛠️ 动手实践
- 分别用默认内存存储和 LibSQLStore 跑同一个含 suspend 的 workflow,重启进程对比 resume 结果。
- 注册 Turso 云端 LibSQL 实例,把本地数据迁移上去。
- 查看你所用适配器支持哪些 domain,找出缺失的领域并思考替代方案。