>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
Rust

celldを使って自有サーバーでCloudflare Durable Objectsを実行する方法

Ryan DahlとDenoチームは、celldプロジェクトを静かにオープンソース化了しました。CloudflareユーザーのDurable Objectsのコンセプトに憧れたことがあるけれど、ベンダーロックインの回避に苦労しているという方にとっては、興味深い内容かもしれません。

celldは、Rustで書かれたデーモンランタイムで、Cloudflare Workersバンドルと分離されたDurable Objectsインスタンスを自有のハードウェアで実行できます。EtcdもRaftも、重いオーケストレーションサービスも不要です。

コンセプトの本質

従来のバックエンドは、一般的にステートレスなマイクロサービスと、単一の大きなリレーショナルデータベースに分割されます。負荷が増加すると、データベースが必然的に主なボトルネックになります。

Cloudflareは異なるアプローチを提案しました。アクティブなアプリケーションエンティティ(チャットルーム、カート、ドキュメントセッションなど)ごとに、V8 isolateと専用のSQLiteデータベースを付与します。オブジェクトはリクエストが来ると起床し、メモリとローカルのSQLiteファイルに状態を保持し、アイドル状態になったら単にスリープします。

主な問題は、エコシステムの閉鎖性でした:Cloudflareのインフラストラクチャの外でこのようなセットアップを実行することは、これまで事実上不可能でした。

celldの内部動作

celldの開発者は、思い切ったシンプル化を追求しました。ノードアーキテクチャは4つのコンポーネントで構成されています:

  1. WranglerバンドルからJavaScriptとTypeScriptコードを実行するための組み込みV8。
  2. 各オブジェクト用のローカルSQLite。
  3. 信頼できる唯一の情報源としてのS3互換ストレージ(AWS S3、MinIO、Cloudflare R2)。
  4. ノード間のデータ交換用のHMAC署名付きサーバー間トランスポート。

ここで最も興味深い解決策は、古典的なコンセンサスプロトコルの放棄です。クラスターノードはリーダーを選出したり、Consulを実行したりする必要がありません。

代わりに、サーバーは原子的なCompare-And-Swap(CAS)操作を通じてS3と通信します。ノードがオブジェクトの所有権を取得したい場合は、S3バケットに所有権ファイルを書き込みます。CASで最初にレコードを更新できた人がトラフィックを処理します。ノードがクラッシュすると、書き込みタイムアウトが期限切れになり、隣接サーバーがオブジェクトを引き取り、バケットから最新のSQLiteデータベースをダウンロードして作業を続行します。

起動とデプロイ

プロジェクトのビルドには標準的なWranglerビルドが使用できますが、5のサーバーと6のバイナリが必要です。

インストールは1つのコマンドで完了します:

0

ワークフローは2ステップで構成されます。まず、workerビルドをバケットにアップロードします:

1

次に、サーバーでデーモンを起動します:

2

クラスター内の各ノードは、バケットからマニフェスト7を読み取ります。追加のサーバーを起動する必要がある場合は、同じバケットを指定して別のプロセスを起動し、8でネットワークアドレスを指定します。

セキュリティについて:celldのサーバー間トラフィックは、デフォルトではTLS暗号化されません。著者は、内部ノードポートをWireGuardやTailscaleなどの安全なオーバーレイネットワークの背後に配置することを推奨しています。すべてのピアリクエストは、最初のノードがバケット内で自動的に作成するHMACキー9で自動的に署名されます。

診断と負荷管理

クラスターモニタリングには、10ユーティリティがあります。隣接ノードをポーリングして現在のメトリクスを表示します:

3

このコマンドは、各ノードのCPU使用量、RSSメモリ、アクティブなWebSocket接続数、ライブオブジェクト数を 출력します。

サーバーが過負荷になり始めた場合、celldにはアクティブなオブジェクトのプレッシャーシェディングメカニズムがあります。制限は環境変数で設定します:

4

しきい値を超えると、celldは非アクティブなオブジェクトをS3に保存し、所有権を解放し、負荷が11の値まで低下するまで新しいエンティティの受け入れを停止します。頻繁なリクエストや開いているWebSocket接続を持つオブジェクトには影響しません。

コントリビューションへの珍しいアプローチ

12リポジトリにアクセスしてPull Requestを開こうとすると、ボタンが無効になっていることに気づきます。フォークは許可されていますが、GitHubでのPRは完全に無効化されています。

Ryan DahlはこれをAIエージェントからのスパムとの戦いとして説明しています:コンテキストのない巨大な自動生成されたプルリクエストのレビューは、メンテナーから 너무多くの時間を奪います。パッチを送りたい人は、13を作成して14の個人アドレスにメールを送るよう求められています。

このプロジェクト注目すべき人

プロジェクトは積極的に開発中で、プロトコル仕様はRustのcrateコード15に直接保存されています。重要な本番環境に採用するにはまだ早いですが、試す価値は十分あります。

このツールは以下のケースで役立ちます:

  1. マルチプレイヤーサービス、チャット、カスタムCRMの開発者。
  2. Cloudflareロックインから脱却したいが、コードの書き直しを避けたいチーム。
  3. クライアントユーザーごとに個別のデータベースを持つアーキテクチャのファン。
  4. RaftやEtcdを使わずに分散システムを学びたいエンジニア。

関連プロジェクト