Workflows の作成、デプロイ、実行に適用される制限は次のとおりです。
多くの制限は Workers スクリプトに適用される制限を引き継いでおり、Workers の制限 のドキュメントに記載されています。
| 機能 | Workers Free | Workers Paid |
|---|---|---|
| スクリプトあたりの Workflow クラス定義 | スクリプトサイズ上限 3 MB(Worker サイズ制限 に従う) | スクリプトサイズ上限 10 MB(Worker サイズ制限 に従う) |
| アカウントあたりのスクリプト総数 | 100 | 500(Worker スクリプト制限 と共有) |
| ステップあたりのコンピューティング時間 1 | 10 ms | 30 秒(デフォルト)/ アクティブ CPU 時間 を最大 5 分まで設定可能 |
| ステップあたりの継続時間(ウォールクロック) 1 | 制限なし | 制限なし。ネットワーク I/O の待ちやデータベースクエリなど |
| ステップあたりの非ストリーム結果の最大サイズ 2 | 1MiB(2^20 バイト) | 1MiB(2^20 バイト) |
| イベントの最大 ペイロードサイズ | 1MiB(2^20 バイト) | 1MiB(2^20 バイト) |
| Workflow インスタンスあたりの永続化できる最大状態 3 | 100MB | 1GB |
step.sleep の最大期間 |
365 日(1 年) | 365 日(1 年) |
| Workflow あたりの最大ステップ数 4 | 1,024 | 10,000(デフォルト)/ 最大 25,000 まで設定可能 |
| Workflow 実行回数の上限 | 1 日あたり 100,000(Workers の日次制限 と共有) | 制限なし |
| アカウントあたりの同時 Workflow インスタンス数(実行) 5 | 100 | 50,000 |
| Workflow インスタンス作成レートの上限 6 | 1 秒あたり 100 7 | アカウントあたり 1 秒 300 7、Workflow あたり 1 秒 100 |
| キュー済みインスタンス の最大数 | 100,000 | 2,000,000 |
| 完了した Workflow インスタンス状態の保持期間 | 3 日 | 30 日 8 |
| Workflow 名の最大長 9 | 64 文字 | 64 文字 |
| Workflow インスタンス ID の最大長 9 | 100 文字 | 100 文字 |
| Workflow インスタンスあたりのサブリクエスト最大数 | 50/リクエスト | 10,000/リクエスト(デフォルト)/ 最大 1,000 万まで設定可能 |
| ステップあたりの最大リトライ回数 | 10,000 | 10,000 |
JavaScript Workflows で、ステップから大きなバイナリ出力を永続化したい場合は、ReadableStream<Uint8Array> を返します。ストリーム出力もインスタンスあたりのストレージ制限に含まれるため、非常に大きい成果物や長く残す成果物は R2 などの外部ストレージに保存し、適切なときは参照を返します。
waiting 状態のインスタンス(step.sleep でのスリープ、リトライ待ち、または step.waitForEvent でのイベント待ち)は、同時実行数の制限に含まれません。そのため、スリープ中またはイベント待ちの Workflow インスタンスを同時に数百万持てます。制限(同時インスタンス 10,000)に含まれるのは、アクティブに running しているインスタンスだけです。
ただし、すでに 10,000 のインスタンスが同時に実行中の場合、waiting 状態だったインスタンスはすぐには再開されず、キューに入ります。
インスタンスが running から waiting へ遷移すると、ほかの queued インスタンスがスケジュールされます(通常は最も古いキュー済みインスタンスが、ベストエフォートで選ばれます)。待ち時間が非常に短い場合、この状態遷移は起きないことがあります。
たとえば、作業をしたあと 30 日待ち、そのあとさらに作業を続ける Workflow を考えます。
import {
WorkflowEntrypoint,
WorkflowStep,
WorkflowEvent,
} from "cloudflare:workers";
type Env = {
MY_WORKFLOW: Workflow;
};
export class MyWorkflow extends WorkflowEntrypoint<Env> {
async run(event: WorkflowEvent<unknown>, step: WorkflowStep) {
await step.do("initial work", async () => {
let resp = await fetch("https://api.cloudflare.com/client/v4/ips");
return await resp.json<any>();
});
await step.sleep("wait 30 days", "30 days");
await step.do(
"make a call to write that could maybe, just might, fail",
{
retries: {
limit: 5,
delay: "5 seconds",
backoff: "exponential",
},
timeout: "15 minutes",
},
async () => {
if (Math.random() > 0.5) {
throw new Error("API call to $STORAGE_SYSTEM failed");
}
},
);
}
}ある Workflow インスタンスが 30 日待っているあいだは waiting 状態になり、同時実行数の上限に達している場合は、ほかの queued インスタンスが実行できます。
Workers Paid では、schedules で作成された Workflow インスタンスは、cron の発火ごとに最大 1 時間、Workflow の同時実行スロットを消費せずに実行できます。
そのバジェットを使い切ると、インスタンスは譲って通常の同時実行キューに入ります。同時実行スロットが空いたときに再開します。この cron 同時実行バジェットを使ったことが原因で、インスタンスが失敗したり、タイムアウトしたり、終了したりすることはありません。
Workflow の schedules には、次の制限が適用されます。
| 制限 | 値 |
|---|---|
アカウントあたりの schedules(cron 式)の最大数 |
100 |
| cron 式の最大長 | 256 文字 |
各 Workflow インスタンスはデフォルトで 10,000 ステップまで対応しますが、Wrangler 設定で最大 25,000 ステップまで上げられます。詳細は Workflow のステップ数制限 を参照してください。
Workflows は Worker スクリプトであり、Workers と同じ 呼び出しあたりの CPU 制限 を共有します。CPU 時間はアクティブな処理時間です。ネットワークリクエスト、ストレージ呼び出し、そのほか一般的な I/O の待ち時間は、CPU 時間にも Workflows のコンピューティング消費にも含まれません。
Workflow が CPU 時間の上限を超えると、次のエラーがスローされます。
Error: Worker exceeded CPU time limit.これは wrangler tail の結果では exceededCpu、Workers のメトリクス では exceededResources と表示されます。
デフォルトでは、Workflow 呼び出しあたりの最大 CPU 時間は 30 秒です。Workflow 定義に紐づくすべての呼び出しで上げるには、Wrangler 設定で limits.cpu_ms を設定します。
{
// ...rest of your configuration...
"limits": {
"cpu_ms": 300000, // 300,000 milliseconds = 5 minutes
},
// ...rest of your configuration...
}[limits]
cpu_ms = 300_000CPU 時間と制限の詳細は、Workers のドキュメント を参照してください。
サブリクエストとは、Workflow が Fetch API でインターネット上のリソースへ送るリクエスト、または R2、KV、D1 などのほかの Cloudflare サービスへ送るリクエストです。Workflows は長時間実行され、外部サービスや Cloudflare API を何度も呼び出すことが多いため、デフォルトのサブリクエスト制限を超えることがあります。
Workflow がサブリクエスト制限を超えると、次のエラーがスローされます。
Error: Too many subrequests.これは Workers のメトリクス では exceededResources、wrangler tail の結果では exception と表示されます。
デフォルトでは、Workflow インスタンスあたりのサブリクエスト最大数は Workers Paid プランで 10,000 です。Wrangler 設定で limits.subrequests を設定すると、最大 1,000 万まで上げられます。
{
// ...rest of your configuration...
"limits": {
"subrequests": 10000000, // 10 million (maximum)
},
// ...rest of your configuration...
}[limits]
subrequests = 10_000_000Free プランの Workers は、呼び出しあたり外部サブリクエスト 50、Cloudflare サービスへのサブリクエスト 1,000 のままです。
サブリクエスト制限の詳細は、Workers のドキュメント を参照してください。
ウォールタイム(ウォールクロック時間とも呼ばれます)は、呼び出しの開始から終了までの経過時間の合計です。ネットワークリクエスト、I/O、その他の非同期処理の待ち時間も含みます。CPU 時間 とは異なります。CPU 時間は、CPU がコードを実際に実行している時間だけを測ります。
次の表は、開発者プラットフォーム全体における Worker の呼び出し種別ごとのウォールタイム上限です。
| 呼び出し種別 | ウォールタイム上限 | 詳細 |
|---|---|---|
| 受信 HTTP リクエスト | 無制限 | クライアントが接続している間は、ハード上限はありません。レスポンス本文をストリーミング中の Worker はアクティブのままです。waitUntil() は、レスポンス後または切断後、最大 30 秒まで実行を延ばします。 |
| Cron Triggers | 15 分 | スケジュール実行の Workers は、呼び出しあたり最大 15 分のウォールタイムです。 |
| Queue consumers | 15 分 | 各コンシューマーの呼び出しは、最大 15 分のウォールタイムです。 |
| Durable Object alarm handlers | 15 分 | アラームハンドラーの呼び出しは、最大 15 分のウォールタイムです。 |
| Durable Objects(RPC / HTTP) | 無制限 | 呼び出し元が Durable Object に接続している間は、ハード上限はありません。リクエスト、RPC 呼び出し、レスポンスストリーム、WebSocket、または進行中の I/O がある間、Durable Objects はアクティブのままです。 |
| Workflows(ステップごと) | 無制限 | 各ステップは無制限のウォールタイムで実行できます。個々のステップには、設定した CPU 時間上限 が適用されます。 |
-
各ステップが CPU 時間の上限を超えず、Workflow あたりの最大ステップ数に達しない限り、Workflow インスタンスは無期限に実行できます。 ↩ ↩2
-
非ストリームの
step.do()戻り値に適用されます。JavaScript Workflows では、より大きなバイナリ出力向けに、シリアライズ可能な戻り値の型としてReadableStream<Uint8Array>も使えます。 ↩ -
この合計には、JavaScript の
step.do()呼び出しから返されたストリーム付きステップ出力の永続化バイト数が含まれます。 ↩ -
step.sleepは最大ステップ数の制限に含まれません ↩ -
同時実行数の制限に含まれるのは、
running状態のインスタンスだけです。waiting状態のインスタンスは、これらの制限から除外されます。Workers Paid の cron 起動 Workflow インスタンスには、発火ごとに別枠の 1 時間の cron 同時実行バジェットがあります。 ↩ -
作成または再起動された各インスタンスが、この制限にカウントされます ↩
-
新しい Workflow インスタンスの作成レートを超えると、Workflows は HTTP 429 のレート制限エラーを返します。 ↩ ↩2
-
Workflow インスタンスの状態とログは、Workers Free プランでは 3 日間、Workers Paid プランでは 30 日間保持されます。 ↩