在构建可扩展的多玩家游戏后端或 AI 代理系统时,状态持久化是核心挑战。传统共享数据库容易成为瓶颈,导致高延迟和复杂的事务管理。Rivet Actors 提供了一种创新方案:为每个 Actor 嵌入独立的 SQLite 数据库,实现天然隔离的持久化存储。这种 per-actor SQLite 设计特别适合多租户场景,如每个代理(agent)、每个用户会话或每个游戏文档独立存储状态,支持无限水平扩展,同时保持微秒级低延迟访问。
Rivet 是开源的 serverless 状态 ful 工作负载原语,每个 Actor 内置内存状态、存储、工作流、调度和 WebSocket。关键在于其内置持久化选项,包括内存、键值、嵌入式 SQLite 和外部 PostgreSQL。其中,SQLite 被设计为 “per-actor 嵌入式,直接 SQL 控制”,每个 Actor 的数据库文件独立存放,与计算共置,确保重启或部署后状态无缝恢复。“Rivet Actors 配备 SQLite 或 JSON 持久化,存储可跨重启和部署持久存在。” 这避免了共享 DB 的单点故障和竞争,支持 “一 Actor 一代理 / 会话 / 用户” 的模式,每个实体拥有私有持久化层。
实现起来简单高效。以 TypeScript 示例,在 actor 定义中指定持久化类型:
import { actor } from "rivetkit";
export const gameAgent = actor({
// 内存状态自动持久化到 SQLite
state: {
memory: [],
score: 0,
inventory: {}
},
persistence: "sqlite", // 或 "json" / "postgres"
actions: {
updateMemory: async (c, event) => {
// 直接 SQL 操作私有 DB
await c.storage.execute("INSERT INTO memory (event, timestamp) VALUES (?, ?)", [event, Date.now()]);
c.state.memory.push(event);
},
getScore: (c) => c.state.score,
},
// WebSocket 实时同步
handlers: {
onWebsocketMessage: (c, ws, msg) => {
// 从私有 SQLite 读取历史
const history = c.storage.query("SELECT * FROM memory ORDER BY timestamp DESC LIMIT 10");
ws.send(JSON.stringify(history));
}
}
});
部署时,自托管只需 Docker 运行 docker run -p 6420:6420 rivetkit/engine,SQLite 文件存本地 FS 或 Postgres。云端 Rivet Cloud 自动管理全球边缘网络,每个 Actor DB 隔离在边缘节点。
工程落地参数至关重要。首先,启用 WAL 模式提升并发:初始化时执行 PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL;。WAL 允许多读单写,适合读密集代理(如查询历史)。数据库大小阈值设 100MB/Actor,超过切换 Postgres:监控 PRAGMA page_count * page_size > 100MB。查询超时 50ms,批量插入用事务 BEGIN TRANSACTION; ... COMMIT; 减少锁争用。
监控要点清单:
- 文件大小:Prometheus 指标
rivet_actor_db_size,警报 >80MB。 - 查询延迟:Histogram
rivet_sql_query_duration,P95 <20ms。 - 锁等待:
PRAGMA lock_status,忙锁 >1s 触发告警。 - 真空清理:闲时 cron
VACUUM INTO '/backup/${actor_id}.sqlite',每周执行。 - 备份策略:Actor 休眠时 rsync DB 文件到 S3,恢复用
ATTACH热迁移。 - 索引优化:预建
CREATE INDEX idx_timestamp ON memory(timestamp);,查询加速 10x。
风险与限界:SQLite 单写者锁在高写场景(如实时多人游戏 >10 TPS)瓶颈,阈值超标时渐进迁移 Postgres(Rivet 支持无缝切换)。大文件 (>1GB) 性能衰退,用 PRAGMA cache_size=-64000; (640MB 缓存)。多租户隔离天然,但 Actor ID 哈希分区 FS 避免热点。
在 multiplayer/game backends,用 per-document Actor:每个游戏房间 / 文档一 Actor,SQLite 存聊天、位置、物品,低延迟广播。AI 系统中,每个代理一 Actor,存工具调用历史、LLM 上下文,实现 “思考软件” 的持久记忆。相比 Durable Objects 或 Supabase,Rivet SQLite 零运维、零冷启动(内存热)。
落地 checklist:
- 安装 RivetKit:
npm i rivetkit。 - 定义 Actor 指定
persistence: "sqlite"。 - 本地测试:
npx rivet dev。 - 监控集成:暴露
/metrics。 - 规模化:云端部署,设 idle_timeout=5min。
- 回滚:fallback 到 JSON persistence。
这种设计让后端从 “状态无处不在” 转向 “状态即隔离”,完美适配 2026 年 AI + 游戏融合趋势。
资料来源: [1] https://github.com/rivet-dev/rivet (Rivet README) [2] https://www.rivet.dev/docs/actors/persistence (Persistence 文档)