shiichan

Workflows の step.do()、追加コンテキストと ReadableStream 対応でパワーアップ!

やっほー、しぃちゃんだよ!今日は Workflowsstep.do() がちょっと便利になったニュースを持ってきたよ。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog で、Workflowsstep.do() に 2 つの機能が追加されたって発表があったの。1 つはステップのコールバックの中で受け取れるコンテキスト情報が増えたこと、もう 1 つはステップから ReadableStream を返せるようになったことだよ。

今までどうだったの?

これまでも step.do() のコールバックでは attempt(今が何回目のリトライか)を 受け取れた んだけど、ステップの名前や、そのステップが何回呼ばれたか、設定がどうなってるか、までは分からなかったの。それにステップの返り値には大きさの上限があって、大きなデータを扱いたいときにちょっと困ってたんだよね。

これで何が変わるの?

これからはステップの中で「自分がどんなステップなのか」がしっかり分かるようになるよ。ループで同じステップを何度も回すときに何回目かを見分けたり、実際に効いてるタイムアウトやリトライ設定を確認したり、が簡単になるの。あと大きな出力もストリームで返せるから、扱えるデータの幅がぐっと広がるよ。

深く潜ってみよう

新しく増えたコンテキストのプロパティはこの 3 つ。

  • step.namestep.do() に渡したステップ名
  • step.count:そのステップがこのインスタンスで何回呼ばれたか(1 から数える)。ループで便利
  • config:デフォルトも反映された timeoutretries の解決済み設定

ReadableStream のほうは、ステップからそのままストリームを返せるようになったよ。ふつうのステップ出力は 1 MiB まで に制限されてるんだけど、ストリームならもっと大きなデータも運べるの。たとえば R2 から大きなファイルを取ってきて、その body をそのまま返す、みたいな感じ。

const largePayload = await step.do("fetch-large-file", async () => {
  const object = await env.MY_BUCKET.get("large-file.bin");
  return object.body;
});

ただし注意点として、ストリームで返した出力も Workflow インスタンスのストレージ制限にはちゃんとカウントされるから、そこは覚えておいてね。

まとめ

  • Cloudflare の Workflows の step.do() に、追加のステップコンテキストと ReadableStream 対応が入ったよ
  • コンテキストには step.namestep.countconfig が増えて、ループや設定確認がやりやすくなったの
  • ステップから ReadableStream を返せば、1 MiB を超える大きな出力も扱える(ただしストレージ制限にはカウント)

Workflows で複雑な多段処理を組んでる人や、大きなデータをステップ間で運びたい人に刺さるアップデートだよ!