Rivet Actors are the primitive for stateful workloads. Built for AI agents, collaborative apps, and durable execution.
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 4 个月前 | ||
| 2 个月前 | ||
| 28 天前 | ||
| 4 个月前 | ||
| 4 天前 | ||
| 1 天前 | ||
| 6 个月前 | ||
| 10 天前 | ||
| 2 天前 | ||
| 1 天前 | ||
| 1 天前 | ||
| 1 天前 | ||
| 16 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 6 个月前 | ||
| 1 个月前 | ||
| 4 个月前 | ||
| 1 天前 | ||
| 6 个月前 | ||
| 2 天前 | ||
| 4 天前 | ||
| 1 个月前 | ||
| 2 天前 | ||
| 23 天前 | ||
| 1 年前 | ||
| 23 天前 | ||
| 23 天前 | ||
| 9 个月前 | ||
| 1 个月前 | ||
| 10 天前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 3 年前 | ||
| 1 天前 | ||
| 4 个月前 | ||
| 10 天前 | ||
| 2 个月前 | ||
| 4 个月前 | ||
| 21 天前 | ||
| 1 天前 | ||
| 10 天前 | ||
| 10 天前 | ||
| 5 个月前 | ||
| 6 个月前 | ||
| 11 个月前 | ||
| 10 个月前 | ||
| 1 个月前 | ||
| 6 个月前 |
面向智能体工作负载的高性能、高密度、可扩展编排引擎。
Rivet Actors 是为智能体、工作流和沙箱打造的持久化进程。
6.9 ms 冷启动,单 Actor 仅占 72 KB,单一控制平面支撑数十亿实例。
一个 Rust 二进制文件加一个存储桶,无需数据库,无需消息队列。开源且支持自托管。
快速入门
与你的编码智能体配合使用将 Rivet 技能赋予你的编码智能体,即可创建示例或集成到现有项目中:
兼容 Claude Code、Cursor、Windsurf 及其他 AI 编程工具。 |
从零开始 |
什么是 Rivet?
Rivet 是一个面向智能体工作负载的编排引擎。Kubernetes 调度 Pod,而 Rivet 调度 Actor:具有持久化状态的长生命周期进程,每个 Actor 自带 SQLite 数据库、消息队列、实时连接和调度能力,并通过唯一键进行寻址。
每个智能体、每个会话、每个用户或每个租户对应一个 Actor。运行在原生 Node.js、Bun 或 Rust 之上。开源且支持自托管。
- 每个 Actor 仅占 72 KB:Actor 运行在你已有的节点进程内,而非独立的容器或虚拟机。一台能承载数百个 Pod 的服务器,可以承载数十万个 Actor。
- 6.9 ms 冷启动:冷启动包含 Actor 调度、存储创建及首个请求的响应,无需拉取镜像,无需容器启动。
- 单一控制平面支撑数十亿 Actor:Actor 独立调度,扩展容量只需增加机器。同一个控制平面既能运行一千个 Actor,也能运行十亿个。
- 空闲休眠,按需唤醒:空闲 Actor 会将状态写入磁盘并卸载,下一次请求在 4.4 ms 内将其恢复,状态无损。
- 状态随 Actor 绑定:每个 Actor 拥有独立的 SQLite 数据库和键值存储。控制平面在确认写入前会将数据复制到多个实例的磁盘上,随后在后台将数据迁移至对象存储。存储空间永不耗尽,对象存储也不在写入路径上。
- 一个 Rust 二进制加一个存储桶:无需运行数据库,无需消息总线。控制平面实例完全对等,各自运行全部服务,通过存储桶互相发现。
- 运行时执行 Agent 生成的代码:每段新的、不可信的代码都会获得一个独立的 Actor,拥有自己的数据库和文件系统,无法访问其他 Actor 的资源。
- 兼容你现有的工具链:后端提供类型安全的 SDK,前端提供 React Hooks。无需自定义运行时,你现有的依赖包、工具链和测试无需任何改动即可使用。
后端
import { actor } from "rivetkit";
import { db } from "rivetkit/db";
const agent = actor({
// Per-Actor SQLite database, persisted across restarts and hibernation
db: db({
onMigrate: async (db) => {
// Apply the SQLite schema
await db.execute(`CREATE TABLE IF NOT EXISTS messages (role TEXT, content TEXT)`);
},
}),
actions: {
chat: async (c, text: string) => {
// Durably save the message
await c.db.execute("INSERT INTO messages VALUES (?, ?)", "user", text);
const messages = await c.db.execute("SELECT role, content FROM messages");
const response = streamText({ model: openai("gpt-5"), messages });
// Stream tokens to every connected client for multiplayer
for await (const delta of response.textStream) {
c.broadcast("token", delta);
}
// Durably save the response
await c.db.execute("INSERT INTO messages VALUES (?, ?)", "assistant", await response.text);
},
},
});
客户端(前端或后端)
// Connect to an Actor
const agent = client.agent.getOrCreate("agent-123").connect();
// Listen for realtime events
agent.on("token", delta => process.stdout.write(delta));
// Call an action on the Actor
await agent.chat("how many r's in strawberry?");
Actor 类型
Rivet 推出的每一款产品都是一个 Actor,由同一个控制平面统一调度。
- Actors:长驻进程,内置状态管理、实时通信和调度能力。
- Agents:每个 Agent 对应一个持久化进程,记忆可在重启后保留。
- Workflows:多步骤操作,失败后从断点重放而非从头开始。
- Sandboxes (agentOS):为未编写的代码提供文件系统、Shell 和网络环境。
- Dynamic Apps(预览版):为每个用户生成独立后端,生成即部署。
为 Agent 的一切需求而生
- 编码 Agent:每个 Agent 对应一个 Actor,拥有持久化进程、沙箱环境,状态可在重启后保留。
- Agent 应用构建器:你的产品为每位用户生成一整套后端,每一个都作为独立 Actor 部署,并支持缩容至零。
- 企业专属 Agent:在 VPC 内部署 Agent,与 Postgres、自有 API 和客服系统同处一个网络,数据不出你的云环境。
- 个人 Agent:每位用户拥有一个长驻 Actor,具备记忆、调度和提醒能力,可在线运行数月。
- 实时应用:每个文档、房间或频道对应一个 Actor,将变更广播给所有已连接的客户端。
Actor 与 Kubernetes 的对比
| Rivet Actor | Kubernetes Pod | |
|---|---|---|
| 冷启动 | 6.92 ms | 约 6 s |
| 从休眠唤醒 | 4.37 ms | 约 6 s(新建 Pod) |
| 单实例内存 | 72.4 KB | 约 200 MB |
| 空闲时内存 | 0 MB(自动休眠) | 始终驻留 |
| 扩展规模 | 单一控制平面支撑数十亿 Actor | 每集群约 5k 节点 |
| 存储 | 无上限 SQLite,自动复制并同步至你的存储桶 | 每 Pod 绑定持久卷 |
基准测试详情与方法
- 冷启动(6.92 ms): 从客户端发起到全新创建的带键 Actor 返回完整首次响应,包含调度、存储创建和框架启动:p50 为 6.92 ms,p99 为 8.11 ms,共 1,500 次采样。
- 唤醒(4.37 ms): 从客户端发起到休眠至少 10 秒的 Actor 返回完整响应:p50 为 4.37 ms,p99 为 6.80 ms,共 1,200 次采样。
- 测试环境: 2026 年 10 月 25 日在 Azure
eastus2的三个可用区中测量。三台控制平面实例(Standard_L8as_v5,本地 NVMe),每个可用区一台,每次写入由 3 台中的 2 台确认。一台节点 VM 运行 Node.js 24,位于第一个可用区。完整方法复现步骤见 rivet.dev/docs/benchmarking。 - 单实例内存(72.4 KB): 每个运行中 Actor 的 RSS 增量。使用 Rust rivetkit SDK 测量。
- Kubernetes 数据为公开文献中的典型值,并非同条件对标测试。约 6 s 冷启动假设有预置节点;约 200 MB 为典型空闲 Node.js Pod 的内存占用;约 5k 节点为文档记载的集群上限。
特性
路由、调度、类型系统与遥测,开箱即用。
- 天生容错:节点宕机时,其上的 Actor 会被重新调度到其他节点,状态完整保留。无需自建重放机制或检查点。
- 每个 Actor 自带状态:每个 Actor 都拥有独立的 SQLite 数据库和键值存储。控制平面负责写入复制并将数据同步到对象存储,你无需为 Actor 预估磁盘容量。
- 多区域部署:将 Actor 部署在它所服务的用户和数据附近,请求会自动路由到 Actor 当前所在的位置。
- HTTP 与 WebSocket 网络:通过 HTTP 直接寻址 Actor,或与其保持实时 WebSocket 连接。中间无需队列或消息代理。
- 端到端类型安全:Actor 定义会自动生成对应的客户端类型,签名变更会在编译阶段报错,而非在生产环境才暴露。
- React SDK:官方提供的一等 Hooks,将组件订阅到 Actor 的状态,Actor 更新时自动保持同步。
- OpenTelemetry 与可观测性:以 OTel 格式输出链路追踪、指标和结构化日志,直接接入你现有的 Collector。
- 单一 Rust 二进制:控制平面以单一静态二进制文件交付。在负载均衡器后面运行几个相同实例,配合一个对象存储桶即可——无需先搭建数据库或消息总线。
- Cron 与调度:按定时计划唤醒 Actor,或由 Actor 自行设定时间戳触发,无需独立的调度器。
- 空闲即休眠:空闲的 Actor 会释放资源,下一个请求到来时带着持久化状态醒来。
- Actor 间调用:Actor 之间通过 key 互相寻址,跨集群调用如同调用本地 Actor 一样。
- 无需 Kubernetes Operator:负载均衡器后面一个控制平面,在你的 VPC 内通过纯 HTTP 通信。没有 CRD,没有 Operator,没有需要维护的 Service Mesh。
- 开源:Apache 2.0 协议,支持完整自托管。托管服务运行的正是你可以自行运行的同一套控制平面。
部署方式
所有方案运行的是同一个二进制文件,唯一的区别是谁来运维。 自托管意味着运行四个组件:相同的控制面实例(试用一个即可,生产环境需三个或以上)、每个实例一块持久化磁盘(用于存储最近的写入数据和实例身份)、每个集群一个存储桶(支持 S3、Google Cloud Storage、Azure Blob Storage 或任何兼容 S3 的存储),以及运行你的 Actors 的节点。无需运行数据库,也无需消息队列。本地开发与生产环境完全一致:从笔记本电脑到生产环境,相同的二进制文件、API 和控制面行为。
开源,宽松许可:Apache 2.0 意味着你的基础设施完全归你所有。托管服务运行的控制面与你自行部署的完全相同。与工程师交流 →
与你现有工具无缝集成
后端提供类型化 SDK,前端提供 React Hooks。Rivet 原生运行于 Node.js 和 Bun,无需自定义运行时,因此你现有的依赖包、工具链和测试无需任何改动即可正常工作。
节点部署方式:Docker Compose • Kubernetes • VM 与裸金属 • Hetzner • AWS ECS • Railway • Render
框架:React • Next.js • Hono • Elysia • tRPC • Effect
工具:Vitest • OpenTelemetry • Pino • AI SDK • OpenAPI • AsyncAPI
常见问题
Rivet 支持 BYOC 吗?
支持。Rivet 可以部署到你自己的云账户中,包括隔离网络环境:控制平面和存储均运行在你的 VPC 内部,由 Rivet 负责管理运维。详见 BYOC 文档。
Rivet 提供云端托管吗?
提供。Rivet Cloud 提供全托管服务。它可以将你应用的 Docker 镜像作为 Rivet Cloud 集群上的 Actor 节点运行,你也可以自带计算节点,在自己的计算资源上运行 Actor,同时由 Rivet Cloud 提供控制平面和路由层。
我可以自托管 Rivet 吗?
可以。Rivet 完全支持自托管,详见自托管文档。控制平面可以在任何能运行容器的环境中部署,我们提供了 Docker Compose、Kubernetes、虚拟机与裸金属、Hetzner、Railway、Render 以及 AWS ECS 的部署指南。如需企业级自托管支持,请联系我们。
我还需要 Postgres、FoundationDB 或 NATS 吗?
不需要。对象存储桶是唯一的依赖:无需运行数据库,也无需消息总线,控制平面实例通过存储桶互相发现。Rivet 兼容 Amazon S3、Google Cloud Storage、Azure Blob Storage,以及任何 S3 兼容的存储服务,例如 MinIO、Cloudflare R2 或 Hetzner Object Storage。另外提供本地文件系统后端,方便在单机上体验 Rivet。
Rivet 是开源的吗?
是的。Rivet 基于宽松的 Apache 2.0 许可证开源。你现在看到的就是。
Rivet 和 Kubernetes 有什么区别?
Rivet 是有状态 Actor 的编排器。可以把 Actor 理解为类似 Pod 的概念,但体量更小、更轻量、启动更快:72 KB 和 6.9 毫秒,对比 200 MB 和数秒。每个 Actor 还自带一个无容量上限的 SQLite 数据库用于结构化持久化,可以替代或配合文件系统使用,这比 Kubernetes Pod 提供了更大的灵活性。
Rivet 和 Cloudflare Durable Objects 相比如何?
Rivet 常被用作 Cloudflare Durable Objects 的开源替代方案,易于自托管且可横向扩展。同时它还解决了 Durable Objects 的诸多限制:没有 128 MB 内存上限,存储无容量限制而非 10 GB 的 SQLite 上限,Actor 不会被随机驱逐,而且你可以自由掌控运行时——Actor 运行在原生 Node.js 或 Bun 上,而非自定义运行时。Rivet 还内置了连接管理、事件广播、持久化调度与定时任务、完整的 Vitest 支持、用于优雅排空的生命周期钩子,以及 Actor 升级的管控能力。详见 Cloudflare Durable Objects 对比。
Rivet 使用自定义 V8 运行时吗?
不用。Rivet 运行在原生 Node.js 和 Bun 上,你现有的依赖包、工具链和测试无需任何改动即可直接使用。
Rivet 支持 Bun 吗?
支持。Rivet 在 Node.js 之外同时支持 Bun。
Rivet 支持 Effect 吗?
支持。Rivet Actor 与 Effect 兼容,参见 Effect Agent 示例。
Rivet 和 Erlang、Akka 或 Orleans 类似吗?
Rivet 实现了虚拟 Actor 模式,这与 Orleans 最为接近,但聚焦于现代工作负载的实际需求:以 SQLite 持久化替代简单的 JSON 存储,并支持现代运行时。Erlang 和 Akka 本身不提供开箱即用的虚拟 Actor,尽管生态中已有功能与 Rivet Actor 相当的第三方包。
Rivet 需要 microVM、gVisor 或嵌套虚拟化吗?
不需要。Rivet 只需要一个通过 WebSocket 连接控制平面的标准进程。该进程可以是 Node.js、Bun、Rust,或其他任何语言。
本仓库中的项目
| 项目 | 描述 |
|---|---|
| RivetKit TypeScript | 用于构建 Actor 的客户端与服务端库 |
| RivetKit Rust | Rust SDK |
| RivetKit Python | Python 客户端(实验性) |
| RivetKit Swift | Swift 客户端(实验性) |
| Control Plane | 用于调度、路由和持久化 Actor 的 Rust 控制平面 |
| ↳ Pegboard | Actor 调度与网络 |
| ↳ Gasoline | 持久执行引擎 |
| ↳ Guard | 流量路由代理 |
| ↳ Epoxy | 多区域 KV 存储(EPaxos) |
| Dashboard | 用于调试 Actor 的检查器 |
| Documentation | rivet.dev/actors/docs 的源代码 |
| Examples | 可运行的示例 |
社区
- Discord - 与社区交流
- X/Twitter - 关注获取最新动态
- Bluesky - 关注获取最新动态
- GitHub Discussions - 提问
- GitHub Issues - 报告问题
- Talk to an engineer - 讨论你的使用场景
许可证
项目介绍
开源解决方案,助力部署、扩展及运营您的多人游戏【此简介由AI生成】