Cloud Tasks キューの構成

このページでは、Google Cloud SDK の gcloud コマンドを使用して、Cloud Tasks キューを構成する方法について説明します。

Cloud Tasks キューの構成

Cloud Tasks キューの構成はキューのすべてのタスクに適用されます。構成は、キューの作成時だけでなく、キューの作成後にも行うことができます。

キューの構成には、次の基本的な 3 つの設定項目があります。

ルーティングの構成(App Engine キューのみ)

キューは、適切なワーカーを含むサービスの名前とバージョンを必要とします。これらの情報をターゲットといいます。ターゲットを設定するには、次の 3 つの方法があります。

  • ターゲットを明示的に設定しない。この場合、デフォルトのサービスが使用されます。
  • AppEngineHttpRequestAppEngineRouting を設定することで、タスク自体にターゲットを明示的に宣言する。 デフォルト以外のターゲットを使用する場合におすすめの方法です。
  • appEngineRoutingOverride を使用して、キュー内のすべてのタスクをデフォルト以外のターゲットに明示的に転送する。 この方法では、タスクに設定されている転送をオーバーライドします。

gcloudを使用してデフォルト以外のキューレベルのルーティングを設定し、タスクレベルのルーティングをオーバーライドするには:

gcloud tasks queues update [QUEUE_ID] \
    --routing-override=service:[SERVICE],version:[VERSION]

ここで

  • SERVICE はタスク処理を担当する App Engine ワーカー サービスです。
  • VERSION はアプリのバージョンです。

たとえば、barbequeue というキュー内のすべてのタスクを処理するために worker というワーカー サービスを設定すると、次の関数を呼び出して、そのサービスとデフォルト バージョンにルーティングできます。

gcloud tasks queues update barbequeue \
    --routing-override=service:worker

Describe のキュー:

gcloud tasks queues describe barbequeue

出力は次のようになります。

appEngineRoutingOverride:
  host: worker.[PROJECT_ID].appspot.com
  service: worker
name: projects/[PROJECT_ID]/locations/[LOCATION_ID]/queues/barbequeue
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 1000
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s
state: RUNNING

レート制限の定義

キューによってディスパッチされる同時タスクの最大レートと最大数を設定できます。

gcloud tasks queues update [QUEUE_ID] \
    --max-dispatches-per-second=[DISPATCH_RATE] \
    --max-concurrent-dispatches=[MAX_RUNNING]

ここで

  • DISPATCH_RATE は、実際にはバケット内のトークンが更新される割合を表します。 タスクが比較的安定している状況では、これはタスクがディスパッチされる割合に相当します。
  • MAX_RUNNING は、一度に実行できるキュー内のタスクの最大数です。

たとえば、パラメータを設定せずに barbequeue というキューを作成した場合は、次の関数を呼び出して同時タスクの最大数を更新できます。

gcloud tasks queues update barbequeue \
        --max-concurrent-dispatches=20

Describe のキュー:

gcloud tasks queues describe barbequeue

出力は次のようになります。

name: projects/[PROJECT_ID]/locations/[LOCATION_ID]/queues/barbequeue
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 20
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s
state: RUNNING

gcloud コマンドと queue.yaml を使用した処理速度の定義

キュー処理速度を定義する Cloud Tasks API の方法と、queue.yaml ファイルのアップロードによる方法では、どちらもキューで同じ基盤メカニズムを使用するにもかかわらず、わずかな違いがあります。

どちらの場合も、トークン バケット アルゴリズムを使用して、タスクの実行レートが制御されます。名前付きの各キューには、トークンを保持するバケットがあります。

アプリケーションで 1 つのタスクが実行されるたびに、バケットからトークンが 1 つ削除されます。キューのバケットのトークンがなくなるまでタスクの処理を続けます。キューに指定した max_dispatches_per_second レートに基づいて、システムからバケットに新しいトークンが続けて補充されます。処理対象のタスクがキューにあって、そのキューのバケットにトークンがある場合、システムはトークンと同じ数のタスクを、設定した max_concurrent_dispatches 値まで、同時に処理します。

負荷が不均等になると、バケット内のトークンの数が大幅に増加し、リクエストの急増に伴い、処理が急増する場合があります。この場合、キューの実際のディスパッチ レートが max_dispatches_per_second レートを超え、システム リソースが消費され、ユーザー リクエストの処理とリソースの競合が発生する可能性があります。ダウンストリーム サービスの比較的遅い SLA に基づいてディスパッチ レートを管理するキューを使用している場合、HTTP 429(リクエストが多すぎます)や 503(サービスを利用できません)などのエラーが発生します。

Cloud Tasks API メソッドを使用する場合、キューのディスパッチ レートを定義する 2 つのフィールドがあります。

  • max_dispatches_per_second
  • max_concurrent_dispatches

上記の例のように、3 つ目のフィールド max_burst_size は、max_dispatches_per_second に設定した値に基づいてシステムによって計算されます。

queue.yaml メソッドを使用する場合は、3 つの要素すべてを設定できます。

  • max_concurrent_requestsmax_concurrent_dispatches と同等)
  • ratemax_dispatches_per_second と同等)
  • bucket_sizemax_burst_size と同等)

ほとんどの場合、Cloud Tasks API メソッドを使用してシステムに max_burst_size を設定させると、リクエストのバーストをとても効率的に管理できます。ただし、特に目標のレートが比較的低い場合には、queue.yaml メソッドを使用して手動で bucket_size を小さい値に設定するか、Cloud Tasks API で max_concurrent_dispatches を小さい値に設定すると、より細かく制御できます。

再試行パラメータの設定

タスクが正常に完了しない場合、Cloud Tasks は設定されたパラメータに従って、指数バックオフによりタスクを再試行します。キュー内で失敗したタスクを再試行する最大回数を指定したり、再試行の制限時間を設定したり、試行間隔を制御したりできます。

gcloud tasks queues update [QUEUE_ID] \
    --max-attempts=[MAX_ATTEMPTS] \
    --min-backoff=[MIN_INTERVAL] \
    --max-backoff=[MAX_INTERVAL] \
    --max-doublings=[MAX_DOUBLINGS] \
    --max-retry-duration=[MAX_RETRY_DURATION]

ここで

  • MAX_ATTEMPTS は、最初の試行を含むタスクの最大試行回数です。このフラグを unlimited に設定すると、再試行が無制限に許可されます。
  • MIN_INTERVAL は、再試行の間に待機する最小時間です。値は「s」で終わる文字列でなければなりません(5s など)。
  • MAX_INTERVAL は、再試行の間に待機する最大時間です。値は「s」で終わる文字列でなければなりません(5s など)。
  • MAX_DOUBLINGS は、失敗したタスクの再試行間隔が一定になるまで間隔を倍増する最大回数です。
  • MAX_RETRY_DURATION は、失敗したタスクを再試行する最大時間です。値は「s」で終わる文字列でなければなりません(5s など)。

キューが正常に構成されたことを確認します。

gcloud tasks queues describe [QUEUE_ID]

次のステップ