Workers を知っている場合、Workers for Platforms では次の 4 つの構成要素が加わります。dispatch 名前空間、動的ディスパッチ Worker、ユーザー Worker、任意の outbound Worker です。
dispatch 名前空間は、顧客の Worker をすべて入れるコンテナです。プラットフォームは顧客が書いたコードを受け取り、API リクエストでそのコードをユーザー Worker として名前空間へデプロイします。名前空間の例は staging や production です。Workers と比べて、次の点が異なります。
- Worker 数に上限なし — 名前空間内の Worker には、アカウントあたりのスクリプト制限がありません
- 既定で分離 — 名前空間内の各ユーザー Worker は untrusted モード で動きます。同じ Cloudflare ゾーン上でもユーザー Worker 同士はキャッシュを共有せず、
request.cfオブジェクトにもアクセスできません - 動的な呼び出し — 動的ディスパッチ Worker は、
env.DISPATCHER.get("worker-name")で名前空間内の任意の Worker を呼び出せます
動的ディスパッチ Worker は、プラットフォームへのすべてのリクエストの入口です。動的ディスパッチ Worker は次を行います。
- リクエストのルーティング — ホスト名、パス、ヘッダー、その他の条件に基づき、どの顧客 Worker が各リクエストを処理するかを決めます
- プラットフォームロジックの実行 — 顧客コードの前に、認証、レート制限、リクエスト検証を実行します
- 顧客ごとの制限 — プラン種別に応じて、CPU 時間とサブリクエストに カスタム制限 を適用します
- レスポンスのサニタイズ — 顧客 Worker のレスポンスを変更またはフィルタします
動的ディスパッチ Worker は、dispatch 名前空間バインディング を使ってユーザー Worker を呼び出します。
export default {
async fetch(request, env) {
// Determine which customer Worker to call
const customerName = new URL(request.url).hostname.split(".")[0];
// Get and invoke the customer's Worker
const userWorker = env.DISPATCHER.get(customerName);
return userWorker.fetch(request);
},
};ユーザー Worker には、顧客が書いたコードが入っています。顧客がコードをプラットフォームへ送り、あなたが API リクエストでそのユーザー Worker をデプロイします。ユーザー Worker は dispatch 名前空間にデプロイされ、動的ディスパッチ Worker から呼び出されます。ユーザー Worker に バインディング を渡し、KV、D1、R2、その他の Cloudflare リソースへアクセスさせることもできます。
outbound Worker は、ユーザー Worker が行う fetch() リクエストを傍受します。次の用途で使います。
- egress の制御 — 顧客コードからの外部 API 呼び出しを許可またはブロックします
- リクエストの記録 — 顧客が呼び出している外部サービスを追跡します
- リクエストの変更 — 認証ヘッダーを追加したり、プラットフォーム外へ出る前にリクエストを変換したりします
- リクエストが動的ディスパッチ Worker に届きます(例:
customer-a.example.com/api) - 動的ディスパッチ Worker は、どのユーザー Worker がリクエストを処理するかを決めます
- 動的ディスパッチ Worker は
env.DISPATCHER.get("customer-a")を呼び出し、ユーザー Worker を取得します - ユーザー Worker が実行されます。外部への
fetch()があり、outbound Worker が設定されている場合、それらのリクエストは先に outbound Worker を通ります。 - ユーザー Worker がレスポンスを返します
- 動的ディスパッチ Worker は、返す前にレスポンスを任意で変更できます
Workers for Platforms と Service bindings は、どちらも Worker 間通信を可能にします。呼び出す Worker が事前に決まっている場合は Service bindings を使います。顧客がユーザー Worker を動的にアップロードする場合は Workers for Platforms を使います。
両方を同時に使うこともできます。動的ディスパッチ Worker は、Service bindings で内部サービスを呼びつつ、名前空間内のユーザー Worker へディスパッチできます。