Full Stack Weekでは、開発者がいかにCloudflareネットワークのパワーを利用して、全体がデフォルトでグローバルなアプリケーションを構築するかをテーマにしています。Workersは単にレイテンシーを改善するだけではなく、開発者の生活を楽にし、アプリケーションの耐障害性を高める、根本的に異なるプログラミングパラダイムを提供します。
当社は昨年、Durable Objectsを発表しました。Durable Objectsは、Cloudflareのエッジで稼働するWorkers全体の状態調整に対する当社のアプローチで、共有ホワイトボード、ゲームサーバー、グローバルキューなど、これまでは複雑だったアプリケーションの実装をわずか数行のコードで実現できるようにします。
本日は、Durable Objectsが一般公開され、本番環境で利用可能になったことを発表します。
Durable Objectsの魅力とは?
従来型アプリケーションの多くは、状態調整はデータベースを通して行っています。Workersで構築したアプリケーションは、データベースに関して固有の課題がいくつかあります。いきなりグローバルな規模と大量の並行処理を取り扱わなければならず、共有キーで調整する際にトランザクションのロールバック(取り消し)が頻繁に起こる可能性があるという点です。データベースそのものは構成やスケールが難しく、特にグローバルな規模では困難なため、開発者はデータベースをWorkersのアクセスパターンに合わせて調整する必要があります。
Durable Objectsはシンプルなパラダイムを提案します。JavaScriptのクラスを書けば、アプリケーションがそのクラスの名前付きインスタンス(Cloudflareネットワーク全体を通して必ずユニークなものになります)を作成できます。そのインスタンスが1つのDurable Objectであり、Workers(と他のDurable Objects)はもとのDurable Objectに対し、ID経由でメッセージを送ることができます。Durable Objectは送られてきたメッセージを順番にシングルスレッドで処理し、メッセージ間の調整を行います。また、オブジェクトの耐久性に必要なキー値ペアを格納できる整合性の高いストレージAPIも提供しています。
たとえば、オンライン文書エディターを例にとって話しましょう。通常のアーキテクチャなら、文書の状態をデータベースに保存し、ユーザーが変更を永続化します。しかし、このことがコラボレーションを難しくします。ユーザーが複数いる場合、全員が変更を反映したあとの最新版のドキュメントを見るように保証するには、どうすればよいのでしょうか。
Durable Objectsを使えば、この問題は遥かにシンプルなものになります。Documentクラスを書くことで、メモリー中の各ドキュメントの状態がDurable Objectに格納されます。接続すると、ユーザーはそのドキュメントの最新版を目にすることとなり、他のユーザーと同時に変更を加えることもできます。ユーザーがそのドキュメントを閉じると、Durable Objectもまたメモリーを閉じ、課金を停止しますが、オブジェクトの状態はそのまま維持されます。構成すべきネットワークも管理すべきデータベースも、実装すべき自動拡張型ポリシーもありません。ただ、それだけで機能します。
各オブジェクトはシングルスレッドですが、Durable Objectsは設計上、オブジェクトの集合体が事実上無限にスケールできるようになっています。1つのオブジェクトのライフサイクルは管理されていて、クリーンアップタスクを実行する必要も、システムをスケールダウンする必要もありません。Durable Objectsは、何十万 rpsまでスケールし、その後元通りスケールダウンします。開発者とのやりとりは不要です。
Early Accessの発表以来、構築してきたものは?
まずは、信頼性とパフォーマンスを高めることに注力してきました。R2 storageやCloudflare Waiting Roomなど、クラウドフレアで開発されている多くの新製品の背景にはDurable Objectsが使われています。
特に、Waiting RoomはDurable Objectsを使って、特定サイトへアクセスを試みている世界中のユーザーの現在数を整合性の高いビューで表示します。このように頻繁に更新される状態を従来のデータベースで格納すると、スケールが困難で、グローバルに実行することが遥かに難しくなります。
当社のお客様もDurable Objectsを歓迎してくださっています。ある大手ゲーミング会社では、Durable Objectsで新しいバックエンドアーキテクチャを構築しました。それにより、各ゲームの状態とマルチプレイヤーゲームロビーの両方を調整しています。サーバーやデータベースを管理する必要なく動的にスケーリングができるDurable Objectsの採用は、この会社にとって容易い選択でした。結果として、比較的小さなチームでゲームを成長させることができたのです。
ステータスページのモニターや共有ホワイトボードアプリケーションなど、お客様が構築するアプリケーションは増えています。また、Durable ObjectsとWebSocketを組み合わせて、完全に応答性の高いアプリケーションを作成することが特に注目されており、お客様がこれをさらに構築できるようにリファレンスアーキテクチャを公開しました。
また、システムの運用、特に大量のリクエストに対する運用面でも向上しています。Durable Objectsは今や、オブジェクト全体で毎秒数十万リクエスト、単一のオブジェクトでは数百のリクエストを処理できるようになり、極めて要求が高いお客様においても運用できるようになりました。
当社はJurisdictional Restrictionsを出荷しました。これは、開発者がDurable Objectに地域タグを付けられるようにして、データの処理と格納がその地域で行われるよう保証するもので、拡張がシンプルなDurable Objectsでコンプライアンスを確保します。
さらに、Durable Object格納リクエストの前にキャッシュを追加して、読み込みと書き込みの操作を超高速にし、正しい並行コードの書き込みを簡単にしました。
この他にも、新たなDurable Objectsクラスのアップロードを簡便化、ダッシュボードへのUIの配置、ライブデバッグのための「wrangler dev」と「wrangler tail」のサポートなど、細かい改善もいくつか施しています。
Durable Objectsの今後は?
当社は今後も、Durable Objectsを無限にスケール可能なアプリケーションを構築するための最も簡単なプラットフォームにすべく、努力を続けます。
現在、Durable Objectsは、オブジェクトがパーティション化可能な場合はうまくスケールしますが、各オブジェクトはシングルスレッド実行に限られています。多くのワークロードは、オブジェクトの状態に読み取り専用のアクセスを提供し、状態を変更するときにのみ同期を取るようにすることで、複数のスレッドにまたがってスケールできます。これを「Durable Objectsのレプリケーション」と呼び、現在取り組んでいます。また、Durable Objectへのコールバックを保証するAPIの追加にも取り組んでいます。これにより、開発者は将来の指定された時間にDurable Objectを呼び出して関数を実行できるようになります。これにより、ライフサイクル管理が簡素化され、Durable Objectの上に信頼性の高いキューなどのプリミティブを簡単に構築することができます。さらに、当社の初期発表でお話したオブジェクトの自動マイグレーションのビジョンも含め、オブジェクトを地理的にうまく分散する方法も検討しています。
何か追加を希望される機能がございましたら、メールまたはツイッターでご連絡ください。
Durable Objectsの使い方
Cloudflareダッシュボードを開いてDurable Objectsを有効にし、価格設定にオプトインしてから、当社のサンプルチャットアプリケーションとリファレンスアーキテクチャをこちらよりご確認ください。
構築を楽しんでくださいね!