跳到正文
Hacker News· NathanFlurry·· 8 小时前AI 评分71

Rivet 发布基于 S3 的智能体编排方案 Rivet Actors

Launch HN: Rivet (YC W23) – Scale and Orchestrate Agents on S3

AI 导读

Rivet 发布基于 actor 模型的智能体编排方案 Rivet Actors,每个 Actor 是带内存状态、SQLite 数据库和 WebSocket 的长生命周期进程,以 key 寻址。

正文 · AI 翻译

使用 Rivet Actors 实现快速、高密度、可扩展的编排。
构建于 S3 之上,达到 SSD 速度。

4.99 ms p99 冷启动,每个 Actor 占用 72 KB RAM,可扩展至数十亿

快速开始 • 文档 • 更新日志 • Discord • X

什么是 Rivet?

Rivet 是一个基于 Actor 模型、面向智能体工作负载的编排器。每个 Rivet Actor 都是一个长期存活的进程,具备内存状态、SQLite 数据库、用于实时通信的 WebSocket 以及调度能力,并通过键来寻址。可为每个智能体、会话、用户或租户创建一个 Actor,并在纯 Node.js、Bun 或 Rust 上运行。

  • 每个 Actor 72 KB:Actor 共享一个节点进程,而不是各自启动一个沙箱,因此一台服务器可承载数十万个 Actor。
  • 4.99 ms p99 冷启动:无需拉取镜像,也无需启动虚拟机。
  • 由 S3 支撑的 SQLite,达到 SSD 速度:p99 持久写入 1.07 ms、读取 1.36 ms,成本比复制式 SSD 存储低约 10.4 倍。
  • 空闲时休眠:空闲 Actor 不产生任何成本,并在下一次请求时唤醒,且不丢失任何状态。

后端

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?");

快速上手

配合你的编码智能体使用

将此提示词粘贴到 Claude Code、Cursor、Codex 或任何编码智能体中:

Run npx skills add rivet-dev/skills, then ask me what to build and run it locally.

从零开始

Rivet 发布的每个产品都是一个 Actor,由同一个控制平面调度。

  • Actors:内置状态、实时通信和调度的长期存活进程。
  • Agents:每个智能体一个持久进程,其记忆可在重启后保留。
  • Workflows:多步骤操作,通过重放而非从头开始。
  • agentOS:安全地运行你的智能体编写的代码,并可精细控制网络访问、文件系统访问和资源限制。
  • Dynamic Apps(预览版):每个用户一个后端,在生成的那一刻即完成部署。

为智能体所需的一切而构建

  • 编码智能体:每个智能体一个 Actor,具备持久进程和可在重启后保留的状态。
  • 智能体应用构建器:每个生成的后端都作为独立的 Actor 部署,并可缩容至零。
  • 你的 VPC 中的智能体:在你的数据库和 API 旁边运行智能体,数据无需离开你的云。
  • 实时应用:每个文档、房间或频道一个 Actor,将变更广播给每个客户端。

Actor 与沙箱的对比

指标 Rivet Actor 沙箱
冷启动(p99) 4.99 ms 1.70 s
每实例内存 72.4 KB 512 MiB
存储 S3 上的 SQLite 每个沙箱的磁盘
存储成本 便宜 10.4 倍 复制式 SSD

基准测试详情与方法

  • Rivet 数据来自已发布的 Rivet Actors 与 Cloudflare Durable Objects 基准测试,运行于 Rivet 3.0.3。其代码仓库包含原始样本和用于复现的脚本。
  • 沙箱数据来自有文档记录的默认内存分配和一项第三方冷启动基准测试。
  • 存储成本按 AWS 标价比较 S3 Standard 与三份 Amazon EBS gp3 副本。
  • 来源、日期和完整方法见 rivet.dev/docs/benchmarking。

功能

  • 容错:如果某个节点宕机,其 Actor 会迁移到其他位置,且状态保持完好。
  • HTTP 与 WebSocket 网络:通过 HTTP 调用 Actor,或与其保持实时 WebSocket 连接。
  • 端到端类型安全:为你的后端提供类型化客户端,为你的前端提供 React hooks。
  • Cron 与调度:按计划或在 Actor 自行设定的时间唤醒 Actor。
  • Actor 到 Actor 调用:Actor 通过 key 在集群中互相调用。
  • OpenTelemetry:以 OTel 格式提供追踪、指标和日志。

部署选项

选项 描述 开始使用
本地与自托管 在构建时本地运行 Rivet。在生产环境中,可在 Docker、Kubernetes 或 VM 上运行控制平面。S3 是唯一的依赖项。 自托管文档
Rivet Cloud 在 AWS 或 GCP 上任意区域的全托管专用集群。在 Rivet Cloud 上运行你的节点,或自带节点。 控制台
BYOC 控制平面运行在你自己的 VPC 内,支持 AWS、GCP 或 Azure,由 Rivet 全托管。你的数据永远不会离开你的云。 BYOC 文档

从本地开发到生产环境,每个选项都运行相同的控制平面。联系工程师 →

与你已在使用的工具兼容

为你的后端提供类型化 SDK,为你的前端提供 React hooks。Rivet 运行在原生 Node.js 和 Bun 上,无需自定义运行时,因此你现有的包、工具和测试均可原样使用。

部署节点到:Docker Compose • Kubernetes • VM 与裸金属 • Hetzner • AWS ECS • Railway • Render

框架:React • Effect

运行时:Node.js • Bun • Rust

工具:Vitest • OpenTelemetry • Pino • AI SDK • OpenAPI • AsyncAPI

请求集成 →

常见问题

Rivet 支持 BYOC 吗?

支持。Rivet 可部署到你自己的云账户,包括气隙环境:控制平面和存储运行在你的 VPC 内,由 Rivet 负责运维。参见 BYOC 文档。

Rivet 有云服务吗?

有。Rivet Cloud 在 AWS 或 GCP 上任意区域运行全托管专用集群。它可以将你应用的 Docker 镜像作为 Rivet Cloud 上的节点运行,你也可以自带节点。

我可以自托管 Rivet 吗?

可以。Rivet 完全支持自托管;参见自托管文档。控制平面可运行在任何能运行容器的环境中,并提供 Docker Compose、Kubernetes、VM 与裸金属、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 与沙箱相比如何?

沙箱会为每个 agent 启动一个 VM 或容器,启动慢且大部分时间处于空闲状态。Rivet Actor 运行在共享的节点进程内:启动仅需 72 KB 和 4.99 ms p99,而沙箱需要 512 MiB 和 1.70 s,并且空闲时会休眠。要运行你的 agent 编写的不受信任代码,请使用 agentOS。

Rivet 与 Cloudflare Durable Objects 相比如何?

Rivet 常被用作 Cloudflare Durable Objects 的开源替代方案,易于自托管且可扩展。它还修复了 Durable Objects 的许多限制:没有 128 MB 内存上限,使用无底存储而非 10 GB 的 SQLite 限制,Actor 不会被随机驱逐,并且由于 Actor 运行在原生 Node.js 或 Bun 上而非自定义运行时,你可以控制运行时。Rivet 还内置了连接处理、事件广播、持久化调度和 cron、完整的 Vitest 支持、用于排空的生命周期钩子,以及对 Actor 升级的控制。参见 Cloudflare Durable Objects 对比。

Rivet 使用自定义 V8 运行时吗?

不。Rivet 运行在原生 Node.js 和 Bun 上,因此你现有的包、工具和测试无需更改即可使用。

Rivet 类似 Erlang、Akka 或 Orleans 吗?

Rivet 实现了虚拟 actor 模式,最接近 Orleans,但专注于现代工作负载所需的功能:使用 SQLite 持久化而非简单的 JSON 存储,并支持现代运行时。Erlang 和 Akka 开箱即用并不提供虚拟 actor,不过存在提供与 Rivet Actors 相当功能的生态包。

Rivet 需要 microVM、gVisor 或嵌套虚拟化吗?

不。Rivet 只需要一个通过 WebSocket 连接到控制平面的标准进程。该进程可以是 Node.js、Bun、Rust 或任何其他东西。

本仓库中的项目

项目 描述
RivetKit TypeScript 用于构建 Actor 的客户端与服务器库
RivetKit Rust Rust SDK
RivetKit Python Python 客户端(实验性)
RivetKit Swift Swift 客户端(实验性)
控制平面 负责调度、路由和持久化 Actor 的 Rust 控制平面
↳ Pegboard Actor 调度与网络
↳ Gasoline 持久化执行引擎
↳ Guard 流量路由代理
↳ Epoxy 多区域 KV 存储(EPaxos)
仪表盘 用于调试 Actor 的检查器
文档 rivet.dev/actors/docs 的源文件
示例 可运行的示例

社区

许可证

Apache 2.0

来源:Hacker News · github.com