Cloud Tasks キューでワークフローの実行をバッファリングする
Google Cloud Japan Team
※この投稿は米国時間 2023 年 7 月 12 日に、Google Cloud blog に投稿されたものの抄訳です。
はじめに
前回の投稿では、親ワークフローを使用して子ワークフローを並行して実行し、全体の処理時間を短縮してエラーの検出を容易にする方法について説明しました。今回の投稿のトピックとして、もう 1 つの便利なパターンである、Cloud Tasks キューを使用してワークフローの実行を作成する方法をご紹介します。
アプリケーションでトラフィックが突然急増した場合、多数のワークフローを同時に実行して負荷の増加に対処したいと思うのは自然なことです。ただし、Google Cloud の Workflows では、乱用を防止し、公平なリソース割り当てを確保するために割り当てが適用されます。これらの割り当てにより、リージョンごと、プロジェクトごとにワークフローの同時実行の最大数が制限されます。たとえば、Workflows の同時実行数は現在、デフォルトで最大 2,000 に制限されています。この制限に達すると、割り当てを超える新しい実行は HTTP 429 エラーとなり失敗します。
これには Cloud Tasks キューが役立ちます。Workflow の実行を直接作成するのではなく、Workflow 実行タスクを Cloud Tasks キューに追加し、定義した速度で Cloud Tasks からキューを排出することができます。これにより、ワークフローの割り当てをより有効に活用でき、ワークフローのスムーズな実行が保証されます。


これを設定する方法を詳しく見てみましょう。
Cloud Tasks キューを作成する
まず、Cloud Tasks キューを作成します。Cloud Tasks キューは、親ワークフローと子ワークフローの間のバッファとして機能し、実行速度を調整できるようにするものです。
任意の名前と場所を使用して、Cloud Tasks キューを作成します(最初はディスパッチ レート制限なし)。
キューを配置したので、子ワークフローの設定に進みましょう。
子ワークフローを作成してデプロイする
子ワークフローは特定のタスクを実行し、結果を親ワークフローに返します。
子ワークフローを定義するために workflow-child.yaml を作成します。
この例では、子ワークフローは親ワークフローから iteration 引数を受け取り、10 秒間待機して作業をシミュレートし、結果として文字列を返します。
子ワークフローをデプロイします。
親ワークフローを作成してデプロイする
次に、workflow-parent.yaml で親ワークフローを作成します。
ワークフローでは、最初にいくつかの定数を割り当てます。親ワークフローと子ワークフローの間のキュー名と子ワークフローを参照していることに注意してください。
次のステップでは、Workflows で多数のタスク(その本体は子ワークフローを実行するための HTTP リクエスト)を作成し、Cloud Tasks キューに追加します。
タスクの作成は Workflows でのノンブロッキング呼び出しであることに注意してください。Cloud Tasks は、これらのタスクの実行を処理して、子ワークフローを非同期的に実行します。
親ワークフローをデプロイします。
ディスパッチ レート制限なしで親ワークフローを実行する
親ワークフローを実行する時間:
親ワークフローの実行中に、子ワークフローが並行してほぼ同じように実行されることがわかります。


この場合、100 回の実行は Workflows の同時実行制限を大幅に下回ります。数千件の実行を一度に送信すると、割り当ての問題が発生する可能性があります。このような場合に、Cloud Tasks キューとそのレート制限が役に立ちます。
ディスパッチ レート制限を使用して親ワークフローを実行する
次に、Cloud Tasks キューにレート制限を適用しましょう。この場合、1 秒あたり 1 回のディスパッチ:
親ワークフローを再度実行します。
今回は、よりスムーズな実行速度(1 秒あたり 1 つの実行リクエスト)が表示されます。


まとめ
ワークフローを実行する前に Cloud Tasks キューを導入し、さまざまなディスパッチ レートと同時実行設定を試すことで、ワークフローの割り当てをより効果的に活用し、割り当て関連の不必要なエラーを引き起こすことなく制限値を下回るようにすることができます。
Cloud Tasks の実践的な経験をさらに深めたい場合は、Codelab「Buffer HTTP requests with Cloud Tasks(Cloud Tasks で HTTP リクエストをバッファリングする)」をご確認ください。ご不明な点やフィードバックがございましたら、Twitter で @meteatamel までお気軽にお問い合わせください。




