Durable Actors: Cloudflare Durable Objects のオープンソース代替

Durable Actors はリアルタイムアプリケーション向けの状態保持型サーバーレス関数を提供

Durable Actors は Cloudflare Durable Objects のオープンソース代替として設計されており、ベンダー固定化やメモリ制限を排除しつつ、組み込みの監視機能を提供します。このフレームワークにより、開発者は分散システムにおける永続性、同期、インフラストラクチャの複雑さを抽象化した基本的な構成要素である「アクター」を活用し、AIエージェントスワーム、共同編集ツール(例:Notion)、チャットシステム(例:ChatGPT)など、リアルタイムアプリケーションの構築が可能になります。

コアアーキテクチャ:耐久的状態とシリアライズ実行

フレームワークの中心には「アクター」と呼ばれるクラスがあり、以下の2つの主要な保証を組み合わせています:

  1. 耐久的状態:中断、エラー、サーバー再起動の後もデータが保持されます。@Persisted デコレータでマークされたフィールドはランタイムによって自動的に保存されます。
  2. シリアライズ実行:アクターへの並行呼び出しは順次実行されます。これにより、複数のクライアントがアクターの状態を安全に更新できるようになり、競合状態や複雑なロック機構の必要がありません。

長時間実行される操作をブロッキングせずに処理するため、フレームワークは @Interleave デコレータを提供しています。このデコレータにより、アクターがプロミスを待機している間にも他の呼び出しが実行可能となり、これはLLM出力などのストリーミング応答において、返信生成中でも新しい接続を受け入れる上で極めて重要です。

開発ワークフローと統合

ローカル開発とデプロイ

開発者は npx durable-actors init を使ってプロジェクトを初期化し、npx durable-actors dev でローカルサーバーを起動できます。ランタイムはオンデマンドでアクターを読み込み、状態を自動的に永続化します。本番環境では、Google Cloud Platform (GCP) 上でランタイムを自己ホスティングすることがサポートされています。

タイプセーフなクライアント生成

既存のバックエンドにアクターを統合するため、SDKは npx durable-actors generate を使ってタイプセーフなクライアントを生成します。これにより、バックエンド(例:Express.js)は固有の actorId を使用して特定のアクターへのWebSocket接続を準備できます。

言語サポート

Durable Actors SDK は現在、TypeScript と Python をサポートしており、両言語についてドキュメントとガイドを提供することで、アクター論理とクライアントアプリケーションとの一貫した契約を確保しています。

コミュニティの見解と技術的トレードオフ

このプロジェクトは Cloudflare の代替として歓迎されていますが、Hacker News 上のコミュニティディスカッションでは、仮想アクターモデルを実装する開発者にとっていくつかの技術的考慮事項が指摘されています:

状態の照会可能性

アクターモデルの一般的な課題として、複数のアクターにまたがる状態の照会が困難であることが挙げられます。状態が個々のアクター内にカプセル化されているため、グローバルな照会を行うには、別途照会可能なデータベースに状態を複製するか、状態変更と同時にバージョン付きのドメインイベントをトランザクショナルに発行する必要があります。

パフォーマンスとレイテンシー

一部のユーザーは書き込みレイテンシーに関する懸念を表明しています。あるコメントでは、100ms の書き込み時間が高性能アプリケーションには制限になる可能性があると指摘され、celld と比較して、celld は著しく低い書き込みレイテンシー(約1ms)を主張していると述べられています。

エコシステム比較

コミュニティメンバーは、Durable Actors が他の耐久的実行およびアクターフレームワークとどのように比較されるかについて疑問を呈しています。具体的には:

  • クラウドネイティブサービス:Azure Durable Functions、AWS Lambda Durable Functions、Durable Entities
  • オープンソース代替:celld と Rivet

"素晴らしいように見えるが、仮想アクターモデルの共通の問題の一つは状態の照会だ。きれいに分離された状態DBを持つのは良いことだが、ほとんどの用途では、それを照会できる別のデータベースに状態を再度二重保管することを意味する。"

機能の要約

機能 実装方法
状態の永続化 自動保存用の @Persisted デコレータ
同時実行制御 デフォルトでシリアライズ実行;非同期同時実行には @Interleave
クライアントアクセス Python および TypeScript 向けの自動生成タイプセーフクライアント
デプロイ ローカル開発および GCP 上での自己ホスティング
観測性 組み込みの監視およびデバッグツール

Sources

関連

  • プロジェクト
  • Dispatch
  • プロジェクト
  • Dispatch
  • Dispatch