DenoチームがCloudflareに加わり、workerdとcelldの統合へ
出典: Cloudflare Blog

DenoチームがCloudflareに加わり、Cloudflare WorkersとDurable Objectsを自前の環境で動かしやすくする取り組みを進めます。Ryan Dahl氏は、JavaScriptランタイムの使いやすさに加え、ネットワークアプリケーションの状態管理、分散、拡張を簡素化することも課題だと説明しました。

Denoチームの合流と統合計画

Cloudflareは10月9日、Denoチームが同社に加わると発表しました。あわせて、Workersの実行環境であるworkerdと、Durable Objectsに関わるcelldの作業を統合するとしています。

Dahl氏は、Node.jsを始めた当時、非同期I/Oを扱いやすくすれば、少ないコードでサーバーを作れる可能性を示せたと振り返りました。DenoではJavaScriptを書く体験を改善できた一方、ランタイムの周囲に組み立てる仕組みは大きく変わらなかったと述べています。

今回の取り組みでは、WorkersとDurable Objectsをより多くの場所で使えるようにし、セルフホストを簡素化することを目指します。Cloudflareは、Denoランタイムや各種の取り組みについて、Dahl氏の説明とは別にDenoのブログで案内するとしています。

Durable Objectsがまとめる実行と状態

Dahl氏が着目したDurable Objectsは、個別に指定できる小さなサーバーのような実行単位で、それぞれにSQLiteデータベースを持ちます。JavaScriptは単一スレッドで実行され、WebSocket接続を扱えるほか、ローカルのSQLiteに同期的にアクセスできます。

Cloudflareによると、Durable Objectは計算処理と永続ストレージを組み合わせたWorkersの一種です。オブジェクトごとに世界で一意の名前があり、離れた場所から特定のオブジェクトへリクエストを送り、複数のクライアント間の調整に使えます。

各オブジェクトには永続ストレージが付属し、オブジェクトと一緒に配置されます。Cloudflareは、この構成で状態を持つサーバーレスアプリケーションを構築できると説明しています。従来のNode.jsサーバーに外部データベースやPub/Subを組み合わせる構成と比べ、Durable Objectsは実行、状態、ストレージを一つの単位にまとめます。

リソース単位の分割で拡張する

Durable Objectsでは、アプリケーションのデータを細かなリソースに分け、それぞれにオブジェクトを割り当てられます。Cloudflareの設計例では、リソースの作成・削除や一覧管理を担う制御プレーンと、個々のリソースの読み書きを担うデータプレーンを分けます。

データプレーンのリクエストは、管理用の単一オブジェクトを経由せず、対象データを持つオブジェクトへ直接送れます。Cloudflareは、この分離によってアプリケーションの性能や可用性が一つのオブジェクトに制約されず、数千から数百万のオブジェクトに分散すると説明しています。

Cloudflareによると、データモデルを自己完結したリソースに分けられれば、リソースごとにオブジェクトを割り当てて拡張できます。負荷に応じて制御プレーン自体も複数のオブジェクトに分けられます。また、配置場所を指定し、データや処理を利用者の近くに置く方法もあります。

チャットの例と開発モデル

Dahl氏は、チャットのチャンネルごとにDurable Objectを一つ使う例を挙げました。各オブジェクトがチャンネルのデータとWebSocket接続を扱い、チャンネル単位でデータと接続を分割します。

この設計は、複数のサーバーにチャンネルを分散し、メッセージ履歴やアカウントも扱うという、Dahl氏が示したチャットアプリの要件に対応します。Cloudflareによると、Durable Objectsは共同編集、チャット、マルチプレイヤーゲーム、ライブ通知など、複数のクライアント間で調整が必要な用途にも利用できます。

Cloudflareの開発者向け説明によると、Durable Objectsはリクエストに応じて地理的に近い場所で起動し、アイドル時には停止します。また、世界中に数百万個を用意できるとしています。