pull タスクをリースする

タスクが pull キューに入ると、ワーカーはそれらをリースすることができます。タスクが処理されたら、ワーカーはそのタスクを削除する必要があります。

始める前に

理解しておくべきこと

  • このメソッドは、スタンダード環境のサービス内で実行されているワーカーにのみ適用されます。スタンダード環境にないワーカー サービスを使用してタスクを処理する場合は、Cloud Tasks API のドキュメントをご覧ください。
  • pull キューを使用する場合は、処理量に基づいてワーカーの規模を調整する必要があります。

タスクをリースする

タスクがキューに入ったら、ワーカーは taskqueue.Lease メソッドを使用して、1 つ以上のタスクをリースできます。taskqueue.Add を使用して最近追加されたタスクが taskqueue.Lease で利用可能になるまでには、少し時間がかかることがあります。

リースをリクエストするときは、リースするタスクの数(最大 1,000 個)とリースの期間(秒単位で最大 1 週間)を指定します。最も時間のかかるタスクがリースの期限までに確実に終了するように、リースの期間は十分長くする必要があります。タスクのリースは taskqueue.ModifyLease を使用して変更できます。

タスクをリースすると、そのタスクはリースの期限まで別のワーカーが処理できなくなります。

次のコードサンプルでは、100 個のタスクをキュー pull-queue から 1 時間リースします。

tasks, err := taskqueue.Lease(ctx, 100, "pull-queue", 3600)

タスクタグによる一括処理

タスクはすべて同様とは限りません。コードでタスクにタグ付けし、リースするタスクをタグで選択できます。タグがフィルタの役割を果たします。次のコードサンプルは、タスクにタグを付け、そのタグによってタスクをリースする方法を示しています。

_, err = taskqueue.Add(ctx, &taskqueue.Task{
	Payload: []byte("parse"), Method: "PULL", Tag: "parse",
}, "pull-queue")
_, err = taskqueue.Add(ctx, &taskqueue.Task{
	Payload: []byte("render"), Method: "PULL", Tag: "render",
}, "pull-queue")

// leases render tasks, but not parse
tasks, err = taskqueue.LeaseByTag(ctx, 100, "pull-queue", 3600, "render")

// Leases up to 100 tasks that have same tag.
// Tag is that of "oldest" task by ETA.
tasks, err = taskqueue.LeaseByTag(ctx, 100, "pull-queue", 3600, "")

ポーリング レートの規制

タスクをリースするためにキューをポーリングするワーカーは、キューからタスクが提供される速度よりも速くタスクのリースを試みていないかどうかを検出する必要があります。この障害が発生すると、taskqueue.Lease からバックオフ エラーが返されます。

使用するコードでは、このエラーを処理し、taskqueue.Lease 呼び出しをバックオフし、後で再試行する必要があります。この問題を回避するには、taskqueue.Lease を呼び出すときに、RPC の期限を長く設定することを検討してください。リース リクエストによって空のタスクリストが返された場合も、バックオフが必要になります。

GCP Console でのタスクのモニタリング

アプリケーション内のすべてのタスクおよびキューに関する情報を表示するには、次の手順を実行します。

  1. GCP Console で [タスクキュー] ページを開き、ページの上部にあるメニューバーで [pull キュー] タブを選択します。

    [pull キュー] タブに移動する

  2. 目的のキューの名前をクリックして、キューの詳細ページを開きます。選択したキュー内のすべてのタスクが表示されます。

タスクを削除する

ワーカーはタスクを完了したら、そのタスクをキューから削除する必要があります。ワーカーが処理を終了した後にキューにタスクが残っている場合は、ワーカーが失敗したことが考えられます。その場合、そのタスクは別のワーカーによって処理されます。

タスクのリスト(taskqueue.Lease から返されたリストなど)を削除するには、リストを taskqueue.DeleteMulti に渡します。

tasks, err = taskqueue.Lease(ctx, 100, "pull-queue", 3600)
// Perform some work with the tasks here

taskqueue.DeleteMulti(ctx, tasks, "pull-queue")
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Go の App Engine スタンダード環境