Cloudflare Workers は、ブラウザーや Node.js の JavaScript ↗ と似た動きをします。ただし、コードの考え方にはいくつか違いがあります。内部では、Workers ランタイムは V8 エンジン ↗ を使います。Chromium と Node.js と同じエンジンです。Workers ランタイムは、多くの現行ブラウザーで使える標準 API の多くも実装しています。
ブラウザーや Node.js 向け JavaScript との違いは、実行時に現れます。個人のマシン(たとえば ブラウザーアプリや中央サーバー ↗)ではなく、Workers の関数は Cloudflare のグローバルネットワーク ↗ 上で動きます。数百の拠点に分散した、増え続ける数千台のマシンです。
各マシンは Workers ランタイムのインスタンスをホストし、各ランタイムは数千のユーザー定義アプリケーションを実行できます。このガイドでは、その違いの一部を確認します。
詳細は Cloud Computing without Containers のブログ記事 ↗ を参照してください。
最大の違いは次の 3 つです。Isolate、リクエスト単位のコンピュート、分散実行です。
V8 ↗ は Isolate を調整します。軽量なコンテキストで、コードがアクセスできる変数と、安全に実行できる環境を提供します。Isolate を、関数を動かすサンドボックスと考えることもできます。
1 つのランタイムインスタンスは、数百から数千の isolate を実行し、それらの間をシームレスに切り替えられます。各 isolate のメモリは完全に分離されているため、ランタイム上の他の信頼できないコードやユーザーが書いたコードから、それぞれのコードが保護されます。isolate は非常に速く起動するようにも設計されています。関数ごとに仮想マシンを作るのではなく、既存の環境内に isolate を作成します。このモデルにより、仮想マシンモデルのコールドスタートがなくなります。
他のサーバーレスプロバイダーは、言語ランタイムのインスタンスをそれぞれ実行する コンテナ化されたプロセス ↗ を使います。一方、Workers はコンテナ起動時に JavaScript ランタイムのオーバーヘッドを一度だけ負担します。Workers のプロセスは、個別のオーバーヘッドをほぼゼロのまま、実質的に無制限のスクリプトを実行できます。任意の isolate は、コンテナや仮想マシン上の Node プロセスより約 100 倍速く起動できます。特に、起動時のメモリ消費は isolate の方が 1 桁少なくなります。
ある 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 サイズ、起動時間などの制限を確認します。