Cloudflare Workflows は耐久実行の機能を提供し、バックグラウンドで動く信頼性が高く繰り返し可能なワークフローを作れます。基盤のコンピュートが失敗しても実行を再開し、タスクが最終的に完了するように設計されています。Cloudflare Workers の上に構築されており、スケーリングとプロビジョニングは自動で処理されます。
ワークフローはイベントで起動します。Queue から消費する Event Notifications、HTTP リクエスト、別の Worker、スケジュールされたタイマーなどです。ワークフロー内の個々のステップは、再試行可能な作業単位として設計されています。状態はステップ間で永続化されるため、失敗後も最後に成功したステップから再開できます。ワークフローは各ステップのメトリクスを自動で生成し、デバッグと可観測性に役立ちます。
関連コンテンツ
詳しく知りたい場合は、次のページを参照してください。
Punderful は、Workers、D1、Vectorize、Workers AI、Workflows など、さまざまな Cloudflare の基本要素の使い方を示すサンプルアプリケーションです。D1 データベースに保存した駄洒落(pun)の一覧を表示します。
ホームページには、D1 に保存された最新の駄洒落が一覧表示されます。アプリケーションには Vectorize によるセマンティック検索もあります。検索手順は次のとおりです。
- Punderful の検索ページを開きます。
- 「Search for a pun...」入力欄に検索クエリを入力します。
- 検索ボックスの下に、検索結果がすぐに表示されることを確認します。
新しい駄洒落を追加する手順は次のとおりです。
- Punderful の作成ページを開きます。
- 「Enter your pun here...」テキストエリアに新しい駄洒落を入力します。
- 入力に合わせてプレビューが更新されることを確認します。
- 「Submit Pun」ボタンを選択します。
新しい駄洒落を送信すると、セマンティック検索が動くように Vectorize へインデックスする必要があります。このインデックス処理では、駄洒落のテキストから埋め込み(embeddings)を作成します。リクエストと応答のループでユーザーを待たせないよう、Cloudflare Workflows によるバックグラウンド処理に適した作業です。
新しい駄洒落が送信されたときに必要なバックグラウンド処理を、ワークフローで扱います。
/api/puns エンドポイントから新しい駄洒落を送信すると、まずデータを D1 データベースへ挿入します。その後、後続のバックグラウンド作業を行う新しい Workflow インスタンスを作成して起動します。
このハンドラーでは、c.env.PUBLISH.create(crypto.randomUUID(), { punId, pun: payload.pun }) が、PUBLISH としてバインドされたワークフローの新しいインスタンスを作成し、一意の ID を割り当て、ペイロードとして punId と pun テキストを渡します。
ワークフローのロジックは、WorkflowEntrypoint を継承したクラスで定義します。
run メソッドはワークフロー実行のエントリポイントです。ペイロードを含む event と、個々の耐久ステップを定義する step オブジェクトを受け取ります。
ワークフロー内の離散的で再試行可能な各タスクは、await step.do() で定義します。
任意で、環境に API キーがある場合は、OpenAI の moderation API などの外部サービスでコンテンツモデレーションを行えます。
このステップは OpenAI の moderation API を呼び出します。コンテンツが不適切と判定された場合は、データベース上の駄洒落のステータスを更新し、NonRetryableError をスローします。NonRetryableError をスローすると、このステップは再試行されません。コンテンツは恒久的に不適切と判断されるためです。
次に、Workers AI モデルで駄洒落テキストのベクトル埋め込みを作成します。
このステップは Workers AI の @cf/baai/bge-large-en-v1.5 モデルを使い、pun テキストのベクトル埋め込みを生成します。結果(埋め込みベクトル)はステップの戻り値として、後続のステップで使えます。step.do() により、失敗してもこのステップは再試行され、埋め込みが最終的に作成されます。
任意で、Workers AI の言語モデルを使って駄洒落をカテゴリ分類できます。
このステップは @cf/meta/llama-3.1-8b-instruct モデルと専用のシステムプロンプトを使い、駄洒落のカテゴリを生成します。生成されたカテゴリ文字列はステップの戻り値です。このステップも step.do() の信頼性の恩恵を受けます。
作成した駄洒落の埋め込みと、必要に応じてカテゴリの埋め込みを Vectorize データベースへ挿入します。
このステップは this.env.VECTORIZE.upsert() を使い、生成した埋め込みと関連メタデータを Vectorize データベースへ追加します。これで駄洒落を意味的に検索できます。step.do() により、この重要なインデックス処理が確実に完了します。
最後のステップでは、D1 データベース上の駄洒落のステータスを更新し、公開済みでワークフローが処理済みであることを示します。
このステップは、該当する pun ID の D1 データベースの status 列を "published" に更新します。このステップが完了すると、駄洒落は処理済みとなり、ホームページに表示できる状態になります。
メインの Worker から PublishWorkflow クラスを使えるようにし、D1、AI、Vectorize などの必要なリソースへアクセスできるようにするため、Wrangler の設定ファイルでバインディングを構成します。
この設定は、publish という名前のワークフローを定義し、環境変数 PUBLISH にバインドし、src/index.ts の PublishWorkflow クラスへ紐づけます。Workers AI(AI)と Vectorize(VECTORIZE)のバインディングも示しており、ワークフロー内では this.env 経由でアクセスします。
Vectorize は、このアプリケーションで駄洒落のセマンティック検索を実現するために使うベクトルデータベースです。Workers AI が作成したベクトル埋め込みを保存します。検索機能は、ユーザーのクエリと意味が近い駄洒落を探すために、この Vectorize インデックスを照会します。
ホームページには、最近公開された駄洒落(ステータスが "published")が表示されます。特定の駄洒落の詳細ページには「Similar Puns」が表示されます。これは、現在の駄洒落の埋め込みで Vectorize を照会して見つけます。
Cloudflare Workers と Workflows は需要に応じて自動でスケールするよう設計されています。同時リクエストとバックグラウンドタスクを効率よく処理し、手動のプロビジョニングは不要です。