
2026/11/06 2:17
HN ランチ:Rivet(YC W23)– S3 でエージェントのスケーリングとオーケストレーション
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Rivet は、アクターモデルに基づき S3 上の SQLite を活用して SSD 速度で動作する、高密度かつスケーラブルなエージェントワークロード向けオーケストレーターです。高価なサンドボックスや独自ランタイム(マイクロVM など)を必要とせず、Node.js、Bun、Rust などのネイティブフレームワーク上で直接動作することで実現します。このアーキテクチャにより、起動時間は p99 で 4.99 ms に劇的に短縮され、メモリ使用量は数百メガバイトからアクターあたりわずか 72 KB に削減されます。アイドル状態のプロセスをハイバーネーション化し、ノードリソースを共有することで、単一のサーバー上で数十万のアクターをサポートし、従来の複製 SSD ストレージアプローチと比較してコストは約 10.4 倍低減します。プラットフォームは、自己管理型コンテナ(Docker/Kubernetes)および BYOC セットアップから、AWS、GCP、Azure 上の完全管理クラウドサービスまで、柔軟なデプロイオプションを提供します。RivetKit SDKs、Pegboard スケジューラー、Gasoline エンジン、Guard プロキシ、Epoxy ストアを含む包括的なコンポーネントエコシステムを土台に、複雑な仮想化要件を簡素化すると同時に、Apache 2.0 ライセンス下でエンタープライズ対応の柔軟性を備えています。
本文
Rivet Actors:高速・高密度・拡張可能なオーケストレーション
S3 を基盤とし、SSD の速度で動作します。
- 冷たい開始(Cold Start)の p99 latency が 4.99 ミリ秒
- アクター当り 72 KB の RAM
- 数十億規模までスケーリング可能
Rivet とは?
Rivet は、アクターモデルを基盤としたエージェント型ワークロード専用のオーケストレーターです。
アクターの概要
- 各 Rivet Actor は、メモリ上の状態を保持する長期実行プロセスです。
- 内蔵機能:SQLite データベース、リアルタイム通信用 WebSockets、スケジューリング機能。
- キーでアドレス指定可能(エージェント、セッション、ユーザー、テナントごとに作成)。
- シンプルな Node.js、Bun、または Rust で動作します。
主な仕様
- アクター当り 72 KB
- 各アクターがサンドボックスを起動するのではなくノードプロセスを共有するため、単一サーバーで数十万〜数百万のアクターをホストできます。
- 冷たい開始(p99)4.99 ミリ秒
- イメージのプルや VM の起動不要です。
- S3 上の SQLite で SSD の速度を実現
- p99 レベルでの持続性のある書き込みが 1.07 ミリ秒、読み込みが 1.36 ミリ秒。
- レプリケーション付きの SSD ストレージと比較して約 10.4 倍低コストです。
- アイドル時は休眠
- アイドル状態にあるアクターはコストを発生せず、次のリクエスト時に何らかのデータ損失なく目覚めます。
バックエンドの実装例
サーバーサイド(Rivet Actor)
以下のコードでは、SQLite データベースが永続化され、マルチプレイヤー対応のためのブロードキャスト機能が実装されています。
import { actor } from "rivetkit"; import { db } from "rivetkit/db"; const agent = actor({ // アクター当りの SQLite データベース。再起動や休眠でも状態を保持します。 db: db({ onMigrate: async (db) => { // SQLite スキーマの適用 await db.execute(`CREATE TABLE IF NOT EXISTS messages (role TEXT, content TEXT)`); }, }), actions: { chat: async (c, text: string) => { // メッセージを永続化して保存 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 }); // マルチプレイヤー対応のため、すべての接続クライアントへトークンをストリーム配信 for await (const delta of response.textStream) { c.broadcast("token", delta); } // レスポンスを永続化して保存 await c.db.execute("INSERT INTO messages VALUES (?, ?)", "assistant", await response.text); }, }, });
クライアント(フロントエンドまたはバックエンド)
// アクターへ接続する const agent = client.agent.getOrCreate("agent-123").connect(); // リアルタイムイベントの受信を待機 agent.on("token", delta => process.stdout.write(delta)); // アクターのアクションを実行 await agent.chat("strawberry に含まれる 'r' は何個ありますか?");
始め方
コーディングエージェントとの連携
Claude Code、Cursor、Codex、または任意のコーディングエージェントに以下のプロンプトを貼り付けてください。
「
を実行し、作成したい内容を聞いて実行します。その後、ローカルで動作させるように指示してください。」npx skills add rivet-dev/skills
新規プロジェクトから開始
Rivet が提供するすべての製品はアクターであり、同じ制御平面によってスケジューリングされます。
- アクター:状態、リアルタイム通信、スケジューリング機能を内蔵した長期実行プロセスです。
- エージェント:各エージェント当り永続的なプロセスを持ち、再起動後もメモリ上の情報を保持します。
- ワークフロー:最初からやり直すのではなく、再生されるマルチステップオペレーションです。
- agentOS:エージェントが作成したコードを安全に実行し、ネットワークアクセス、ファイルシステムアクセス、リソース制限について細粒度の制御を行う環境です。
- ダイナミックアプリ(プレビュー):生成された瞬間にデプロイされ、ユーザー当りの専用バックエンドを提供します。
対応しているユースケース
Rivet はエージェントに必要な機能すべてに対応しています。
- コーディングエージェント
- 各エージェント当り 1 つのアクターを持ち、永続的なプロセスと状態を保持し、再起動後も情報を保持します。
- エージェントアプリビルダー
- 生成された各バックエンドは自身のアクターとしてデプロイされ、ゼロにスケーリング可能です。
- VPC 内でのエージェント動作
- データベースや API に隣接してエージェントを実行し、データをクラウド外に出すことはありません。
- リアルタイムアプリ
- ドキュメント、ルーム、チャンネル当り 1 つのアクターを持ち、すべてのクライアントへの変更をブロードキャストします。
アクターとサンドボックスの比較
| 指標 | Rivet Actor | Sandboxed (サンドボックス) |
|---|---|---|
| 冷たい開始(p99) | 4.99 ミリ秒 | 1.70 秒 |
| インスタンス当りメモリ | 72.4 KB | 512 MiB |
| ストレージ | S3 上の SQLite | サンドボックス当りデータディスク |
| ストレージコスト | 10.4 倍安価 | レプリケーション付き SSD |
ベンチマーク詳細と方法論:
- Rivet の数値は、Rivet 3.0.3 で実行された「Rivet Actors vs Cloudflare Durable Objects」の公開ベンチマークからのものです。レポジトリには生のサンプルデータと再現スクリプトが含まれています。
- サンドボックスの数値は、公式ドキュメントに定義されているデフォルトメモリ配分とサードパーティによる冷たい開始ベンチマークから得られています。
- ストレージコストは AWS のリストプライスに基づいた S3 Standard と Amazon EBS gp3 の 3 コピーの比較です。
- ソース、日付、および詳細な方法は rivet.dev/docs/benchmarking を参照してください。
機能
- フォールトトレランス:ノードがダウンしても、アクターは状態を保持したまま他へ移動します。
- HTTP および WebSocket ネットワーキング:HTTP でアクターを呼び出したり、リアルタイムの WebSocket コネクションを維持したりできます。
- エンドツーエンド型安全性:バックエンドとフロントエンド(React)向けの型付けされたクライアントとフックを提供します。
- Cron とスケジューリング:スケジュールまたはアクターが自分で設定した時刻に合わせて目覚めます。
- アクター間の呼び出し:クラスター内のアクターはキーを通じて互いに呼び出せます。
- OpenTelemetry:OTel 形式のトレース、メトリクス、ログを提供します。
デプロイオプション
すべてのオプションで、ローカル開発から本番環境まで同じ制御平面が動作します。
| オプション | 説明 | スタートガイド |
|---|---|---|
| ローカルおよびセルフホスト | 開発中はローカルで実行し、本番環境では Docker、Kubernetes、または VM で制御平面を実行します。唯一の依存関係は S3 です。 | セルフホスティングドキュメント |
| Rivet Cloud | AWS または GCP の任意のリージョンで完全に管理された専用クラスター。ノードを Rivet Cloud に実装するか、自身のもので提供できます。 | ダッシュボード |
| BYOC (Bring Your Own Cloud) | 制御平面が AWS、GCP、または Azure の自社 VPC 内で実行され、Rivet が完全に管理します。データはクラウドを離れません。 | BYOC ドキュメント |
既に利用しているツールとも連携可能
- 型付けされた SDK:バックエンドおよびフロントエンド(React フック)向け。
- ランタイム互換性:カスタムランタイム不要でネイティブ 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
FAQ
Q: Rivet に BYOC はありますか? A: はい。Rivet は空気の隙間(air-gapped)を含むご自身のクラウドアカウントにデプロイできます。制御平面とストレージは VPC 内を実行し、Rivet が運用します。BYOC ドキュメント をご覧ください。
Q: Rivet にクラウドサービスはありますか? A: はい。Rivet Cloud は、AWS または GCP の任意のリージョンで完全に管理された専用クラスターを提供します。アプリケーションの Docker イメージをノードとして Rivet Cloud で実行することも、自身のもので提供することもできます。
Q: Rivet をセルフホストすることは可能でしょうか? A: 可能です。Rivet は完全にセルフホスト可能です。セルフホスティングドキュメント をご覧ください。制御平面はコンテナが動作する場所であればどこでも動作し、Docker Compose、Kubernetes、VM および裸金属サーバー、Hetzner、Railway、Render、AWS ECS 向けのガイドがあります。
Q: Postgres、FoundationDB、NATS も必要でしょうか? A: 不要です。依存関係はオブジェクトストレージバケットのみで十分です:実行するデータベースもメッセージバスもないため、制御平面インスタンスはバケットを通じて互いを見つけます。Rivet は Amazon S3、Google Cloud Storage、Azure Blob Storage、MinIO、Cloudflare R2、Hetzner Object Storage などの S3 互換ストアに対応します。1 マシンでのテストにはローカルファイルシステムバックエンドも利用可能です。
Q: Rivet はオープンソースですか? A: はい。Apache 2.0 ライセンスの下でオープンソースです。ご覧いただいているものがそれです。
Q: Rivet とサンドボックスはどのように異なりますか? A: サンドボックスは各エージェント当り VM やコンテナを起動するため、起動に時間がかかり、大半の時間はアイドル状態です。一方、Rivet Actorは共有ノードプロセス内で動作し、**72 KB のメモリと 4.99 ミリ秒(p99)**での高速起動を実現します。これに対し、サンドボックスは 512 MiB と 1.70 秒かかります。また、アイドル時は休止状態に落ちます。エージェントが作成した非信頼のコードを実行するには agentOS をご使用ください。
Q: Rivet は Cloudflare Durable Objects とどう異なりますか? A: Rivet は Cloudflare Durable Objects のオープンソース代替品として頻繁に使用され、セルフホストとスケーリングが容易です。Durable Objects の多くの制約も解消されています:
- 128 MB のメモリ制限なし
- SQLite の 10 GB リミットではなく無限のストレージ
- アクターのランダムな驱逐(eviction)なし
- 実行環境を制御できること(アクターはカスタムランタイムではなくバニラ Node.js または Bun で動作するため)
さらに、接続ハンドリング、イベントブロードキャスト、永続的なスケジューリングと Cron、完全な Vitest サポート、ドレイン用のライフサイクルフック、アクターアップグレードの制御などを追加しています。Cloudflare Durable Objects 比較 をご覧ください。
Q: Rivet はカスタム V8 ランタイムを使用しますか? A: いいえ。Rivet はネイティブ Node.js および Bun で動作するため、既存のパッケージやツールの構成を変更せずに使用できます。
Q: Rivet は Erlang、Akka、あるいは Orleans のようなものですか? A: Rivet はバーチャルアクターパターンを実装しており、Orleans に最も近いです。ただし、現代のワークロードが必要な機能に焦点を当てています:シンプルな JSON ストアではなくSQLite の永続性保存、および現代的なランタイムへの対応です。
Q: Rivet はマイクロ VM、gVisor、あるいはネストした仮想化を必要としますか? A: 不要です。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:バグを報告
- エンジニアと話す:ユースケースの議論