Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Workers の仕組み

最終更新 Markdown で表示Agent セットアップ

Cloudflare Workers は、ブラウザーや Node.js の JavaScript と似た動きをします。ただし、コードの考え方にはいくつか違いがあります。内部では、Workers ランタイムは V8 エンジン を使います。Chromium と Node.js と同じエンジンです。Workers ランタイムは、多くの現行ブラウザーで使える標準 API の多くも実装しています。

ブラウザーや Node.js 向け JavaScript との違いは、実行時に現れます。個人のマシン(たとえば ブラウザーアプリや中央サーバー)ではなく、Workers の関数は Cloudflare のグローバルネットワーク 上で動きます。数百の拠点に分散した、増え続ける数千台のマシンです。

各マシンは Workers ランタイムのインスタンスをホストし、各ランタイムは数千のユーザー定義アプリケーションを実行できます。このガイドでは、その違いの一部を確認します。

詳細は Cloud Computing without Containers のブログ記事 を参照してください。

最大の違いは次の 3 つです。Isolate、リクエスト単位のコンピュート、分散実行です。

Isolate

V8 は Isolate を調整します。軽量なコンテキストで、コードがアクセスできる変数と、安全に実行できる環境を提供します。Isolate を、関数を動かすサンドボックスと考えることもできます。

1 つのランタイムインスタンスは、数百から数千の isolate を実行し、それらの間をシームレスに切り替えられます。各 isolate のメモリは完全に分離されているため、ランタイム上の他の信頼できないコードやユーザーが書いたコードから、それぞれのコードが保護されます。isolate は非常に速く起動するようにも設計されています。関数ごとに仮想マシンを作るのではなく、既存の環境内に isolate を作成します。このモデルにより、仮想マシンモデルのコールドスタートがなくなります。

他のサーバーレスプロバイダーは、言語ランタイムのインスタンスをそれぞれ実行する コンテナ化されたプロセス を使います。一方、Workers はコンテナ起動時に JavaScript ランタイムのオーバーヘッドを一度だけ負担します。Workers のプロセスは、個別のオーバーヘッドをほぼゼロのまま、実質的に無制限のスクリプトを実行できます。任意の isolate は、コンテナや仮想マシン上の Node プロセスより約 100 倍速く起動できます。特に、起動時のメモリ消費は isolate の方が 1 桁少なくなります。

従来のアーキテクチャ
Workers V8 アイソレート
ユーザーコード
プロセスオーバーヘッド

ある Isolate には独自のスコープがあります。ただし Isolate は必ずしも長寿命ではありません。次のような理由で、Isolate は停止され、退避されることがあります。

  • マシン上のリソース制限
  • 不審なスクリプト。Isolate サンドボックスからの脱出を試みるとみなされたもの
  • 個別の リソース制限

このため、この事態を想定していない限り、グローバルスコープに可変の状態を置かないことを推奨します。

Workers ランタイムのセキュリティの扱いに関心がある場合は、Isolate とセキュリティ、Spectre 脅威軽減の関係 を参照してください。

リクエスト単位のコンピュート

ほとんどの Workers は、デフォルトの Workers フローのバリエーションです。

export default {
	async fetch(request, env, ctx) {
		return new Response('Hello World!');
	},
};
export default {
	async fetch(request, env, ctx): Promise<Response> {
		return new Response('Hello World!');
	},
} satisfies ExportedHandler<Env>;

ES modules 構文 で書いた Workers では、*.workers.dev サブドメインまたは Cloudflare 管理ドメインへのリクエストが Cloudflare のいずれかのデータセンターで受信されると、そのリクエストは Worker コードに定義した fetch() ハンドラー を、受け取ったリクエストとともに呼び出します。Response オブジェクトを返すことで、リクエストに応答できます。

分散実行

Isolate は、リクエストのあいだ耐障害性があり継続して利用できます。ただしまれに退避されることがあります。Worker が公式の 制限 に達したときや、リクエストが動いているマシンのリソースが極端に逼迫したとき、ランタイムはイベントを適切に解決したあと、選択的に Isolate を退避します。

ほかの JavaScript プラットフォームと同様、1 つの Workers インスタンスは、シングルスレッドのイベントループで複数のリクエスト(同時リクエストを含む)を扱えます。つまり、リクエスト処理中に fetch などの async タスクを待っているあいだに別リクエストが来ると、そのリクエストが処理される場合も、されない場合もあります。 2 つのユーザーリクエストが同じ Worker インスタンスにルーティングされる保証はないため、Cloudflare はグローバル状態の利用や変更を推奨しません。

関連リソース

  • fetch() ハンドラー — Worker への着信 HTTP リクエストが fetch() ハンドラーへ渡される流れを確認します。
  • Request — 着信 HTTP リクエストが fetch() ハンドラーへ渡される仕組みを学びます。
  • Workers の制限 — Worker サイズ、起動時間などの制限を確認します。

役に立ちましたか?