push キューの Cloud Tasks への移行

このページでは、push キューコードをタスクキューからクラウドタスクに移行する方法について説明します。現在のところ、クラウドタスクが App Engine の push キューを使用する場合のおすすめの方法となっています。

概要

クラウドタスクでは、Task Queues RPC API でアクセスするのと同じサービスにアクセスします。つまり、既存の push キューや push タスクを再作成する必要はありません。ただし、Cloud Tasks API を使用するには、push キューまたは push タスクを作成、操作するコードを移行する必要があります。

push キューと push タスクは、Cloud Tasks の REST API と RPC API、Java 用クライアント ライブラリ、Google Cloud CLI、Google Cloud コンソールを使用して作成、操作できます。このページでは、gcloud CLI と Cloud Tasks の Java 用クライアント ライブラリを使用する場合の例を示します。

クラウドタスクでは、すべてのキューが push キューとして動作します。このガイドの残りの部分とクラウドタスクのドキュメントでは、「キュー」という用語が「push キュー」という用語と同義で使用されています。同様に、「タスク」という用語も「push タスク」という用語と同義です。

クラウドタスクで現在利用できない機能

現在、クラウドタスクでは次の機能は使用できません。

  • Datastore トランザクションの中でタスクをキューに追加する
  • ワーカー サービスの代わりに遅延タスク ライブラリを使用する
  • マルチテナント アプリケーションでタスクを扱う
  • ローカル開発サーバーでのシミュレーション
  • 非同期でのタスクの追加

料金と割り当て

push キューをクラウドタスクに移行すると、アプリの料金と割り当てに影響する場合があります。

料金

クラウドタスクには独自の料金が設定されています。タスクキューと同様に、App Engine アプリにタスクを使用してリクエストを送信するとアプリに費用がかかることがあります。

割り当て

クラウドタスクの割り当ては、タスクキューの割り当てとは異なります。タスクキューと同様に、Cloud Tasks から App Engine アプリにリクエストを送信すると、App Engine リクエストの割り当てに影響する場合があります。

移行前

このセクションでは、push キューをクラウドタスクに移行する前に必要なことについて説明します。

pull キューの移行

push キューを移行する前に、pull キューを移行するためのガイドを使用して pull キューを移行してください。push キューの移行後に pull キューを移行することは、queue.yaml ファイルの必要な使用がクラウドタスクで予期しない動作を引き起こす可能性があるため、おすすめしません。

キュー構成の保護

クラウドタスクへの移行プロセスを開始すると、queue.yaml ファイルを変更する際に予期しない動作が発生する場合があるためおすすめしません。キュー構成を queue.yaml ファイルによる変更から保護するには、次の手順を行います。

  1. 今後のデプロイで queue.yaml ファイルを省略するように gcloud CLI を構成します。

    queue.yaml ファイルを .gcloudignore ファイルに追加します。.gcloudignore ファイルがすでに存在しているか確認するには、ターミナルでデバイスの最上位レベルのディレクトリから次のコマンドを実行します。ファイルが存在する場合、このコマンドでファイル名が出力されます。

    ls -a | grep .gcloudignore

    .gcloudignore ファイルの詳細については、.gcloudignore リファレンスをご覧ください。

  2. queue.yaml ファイルの権限を制限します。

    キュー構成の保護に関するガイドに記載されているおすすめの方法に従ってください。

  3. クラウドタスクと queue.yaml ファイルについて学習する(省略可)。

    Cloud Tasks API を使用してキュー構成を管理する場合、queue.yaml ファイルをデプロイすると、Cloud Tasks によって設定された構成がオーバーライドされ、予期しない動作が発生する可能性があります。詳細については、キュー管理と queue.yaml の使用をご覧ください。

Cloud Tasks API の有効化

Cloud Tasks API を有効にするには、API ライブラリの [Cloud Tasks API] で [Enable] をクリックします。[Enable] ボタンの代わりに [Manage] ボタンが表示されている場合は、以前にプロジェクトの Cloud Tasks API を有効にしているため、再び有効にする必要はありません。

Cloud Tasks API に対するアプリの認証

Cloud Tasks API に対してアプリを認証する必要があります。このセクションでは、2 つの異なるユースケースの認証について説明します。

アプリをローカルで開発またはテストするには、サービス アカウントを使用することをおすすめします。サービス アカウントを設定してアプリに接続する手順については、サービス アカウントの資格情報を手動で取得して提供するをご覧ください。

アプリを App Engine にデプロイする場合、新しい認証を行う必要はありません。アプリケーションのデフォルト認証情報(ADC)では、App Engine アプリの認証の詳細が推測されます。

gcloud CLI のダウンロード

まだインストールしていない場合は、gcloud CLI をダウンロードしてインストールし、gcloud CLI と Cloud Tasks API を使用します。gcloud CLI がすでにインストールされている場合は、ターミナルで次のコマンドを実行します。

gcloud components update

Java 用クライアント ライブラリをインポートする

App Engine アプリで Java 用 Cloud Tasks クライアント ライブラリを使用する手順は次のとおりです。

  1. pom.xml ファイルで Cloud Tasks クライアント ライブラリの依存関係を指定します。

    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-tasks</artifactId>
      <version>1.3.0</version>
    </dependency>
    
  2. Cloud Tasks クライアント ライブラリの依存関係を、タスクの作成とキューへの追加で使用するファイルにインポートします。

    import com.google.cloud.tasks.v2.AppEngineHttpRequest;
    import com.google.cloud.tasks.v2.CloudTasksClient;
    import com.google.cloud.tasks.v2.HttpMethod;
    import com.google.cloud.tasks.v2.QueueName;
    import com.google.cloud.tasks.v2.Task;
    

キューの作成と管理

このセクションでは、Cloud Tasks API を使用してキューを作成および管理する方法について説明します。

クラウドタスクでは、キューの作成や管理に queue.yaml ファイルを使用しません。その代わりに、Cloud Tasks API が使用されます。queue.yaml ファイルと Cloud Tasks API の両方の使用はおすすめしませんが、アプリによってはタスクキューから Cloud Tasks への移行が避けられない場合があります。ベスト プラクティスについては、キュー管理と queue.yaml の使用をご覧ください。

キューの作成

アプリでプログラム的にキューが作成される場合、またはコマンドラインから追加のキューを作成する場合は、このセクションをお読みください。

クラウドタスクのキューの名前は projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID という形式に従います。キュー名の LOCATION_ID 部分が、Google Cloud のリージョンに対応しています。キュー名の QUEUE_ID の部分は、Task Queues キューの name フィールドと同じになります。キュー名は、プロジェクト、リージョン、およびユーザーが指定した QUEUE_ID に基づいて、キューが作成される際に生成されます。

一般に、キューのロケーション(つまりリージョン)はアプリのリージョンと同じである必要があります。このルールに対する 2 つの例外は、europe-west リージョンを使用するアプリと us-central リージョンを使用するアプリの場合です。クラウドタスクのこれらのリージョンは、europe-west1 および us-central1 とそれぞれ呼ばれます。

キューを作成する際にオプションのキュー構成を指定できるだけでなく、作成の後にキューを更新することもできます。

既存のキューを再作成する必要はありません。その代わりに、このガイドの関連部分を読んで、既存のキューを操作するコードを移行してください。

キュー名の再利用

同じプロジェクトとロケーション(つまりリージョン)に同じキュー ID を持つキューを作成する場合、キューを削除してから 7 日間待つ必要があります。

次の例では、クラウドタスクを使用して 2 つのキューを作成しています。最初のキューのキュー ID は queue-blue です。すべてのタスクが 5/s のレートでバージョン v2 のサービス task-module に送信されるように構成されています。2 番目のキューのキュー ID は queue-red です。1/s のレートでタスクがディスパッチされます。これらの両方が、ロケーション us-central1your-project-id というプロジェクト ID のプロジェクトに作成されています。これは、タスクキューでキューの作成に相当するクラウドタスクです。

gcloud

gcloud CLI は、gcloud CLI 構成からプロジェクトとロケーションを推測します。

gcloud tasks queues create queue-blue \
--max-dispatches-per-second=5 \
--routing-override=service:task-module,version:v2
gcloud tasks queues create queue-red \
--max-dispatches-per-second=1

クライアント ライブラリ

import com.google.cloud.tasks.v2.AppEngineRouting;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.LocationName;
import com.google.cloud.tasks.v2.Queue;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.RateLimits;

public class CreateQueue {
  public static void createQueue(
      String projectId, String locationId, String queueBlueName, String queueRedName)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueBlueName = "queue-blue";
      // String queueRedName = "queue-red";

      LocationName parent = LocationName.of(projectId, locationId);

      Queue queueBlue =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, queueBlueName).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(5.0))
              .setAppEngineRoutingOverride(
                  AppEngineRouting.newBuilder().setVersion("v2").setService("task-module"))
              .build();

      Queue queueRed =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, queueRedName).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .build();

      Queue[] queues = new Queue[] {queueBlue, queueRed};
      for (Queue queue : queues) {
        Queue response = client.createQueue(parent, queue);
        System.out.println(response);
      }
    }
  }
}

詳しくは、Cloud Tasks リファレンスの Cloud Tasks キューの作成をご覧ください。

キューの処理速度の設定

次の表に、タスクキューとクラウドタスクで異なるフィールドを示します。

Task Queues のフィールド Cloud Tasks のフィールド 説明
rate max_dispatches_per_second キューからタスクがディスパッチされる最大レート。
max_concurrent_requests max_concurrent_dispatches キューからディスパッチできる同時タスクの最大数
bucket_size max_burst_size

クラウドタスクでは、max_dispatches_per_second の値に基づいてキュー内のタスクの処理速度を制限する取得専用の max_burst_size プロパティが計算されます。このフィールドを使用すると、キューのレートが高くなり、タスクがキューに登録された直後に処理が開始されますが、短時間で多くのタスクがキューに登録された場合にリソースの使用が制限されます。

queue.xml/yaml ファイルを使用して作成または更新された App Engine キューの場合、max_burst_size は最初は bucket_size と等しくなります。ただし、クラウドタスクのインターフェースを使用してキューが update コマンドに渡されると、max_dispatches_per_second が更新されたかどうかに関係なく、max_dispatches_per_second の値に基づいて max_burst_size がリセットされます。

total_storage_limit クラウドタスクでは非推奨 クラウドタスクは現在、カスタム ストレージ上限の設定をサポートしていません

キューの作成やキューの更新の際に、キューの処理速度を設定できます。以下の例では、クラウドタスクを使用して、すでに作成された queue-blue という名前のキューに処理速度を設定しています。queue-bluequeue.yaml を使用して作成または構成された場合、以下の例では、20max_dispatches_per_second の値に基づいて max_burst_size がリセットされます。このクラウドタスクは、タスクキューでキュー処理率を設定する場合と同等です。

gcloud

gcloud tasks queues update queue-blue \
--max-dispatches-per-second=20 \
--max-concurrent-dispatches=10

クライアント ライブラリ

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.LocationName;
import com.google.cloud.tasks.v2.Queue;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.RateLimits;
import com.google.cloud.tasks.v2.UpdateQueueRequest;

public class UpdateQueue {
  public static void updateQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "queue-blue";

      LocationName parent = LocationName.of(projectId, locationId);

      Queue queueBlue =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, queueId).toString())
              .setRateLimits(
                  RateLimits.newBuilder()
                      .setMaxDispatchesPerSecond(20.0)
                      .setMaxConcurrentDispatches(10))
              .build();

      UpdateQueueRequest request = UpdateQueueRequest.newBuilder().setQueue(queueBlue).build();

      Queue response = client.updateQueue(request);
      System.out.println(response);
    }
  }
}

詳細については、レート上限の定義をご覧ください。

キューの無効化と再開

クラウドタスクでは、タスクキューの「無効」という用語と同じ意味で、「一時停止」という用語が使用されます。キューを一時停止すると、キューが再開されるまで、キュー内のタスクの実行が停止します。ただし、一時停止中のキューに対してもタスクを追加し続けることができます。クラウドタスクでは、タスクキューの場合と同じ意味で、「再開」という用語が使用されます。

次の例では、queueName というキュー ID のキューを一時停止しています。これは、タスクキューでキューを無効にするに相当するクラウドタスクです。

gcloud

gcloud tasks queues pause queueName

クライアント ライブラリ

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.QueueName;

public class PauseQueue {
  public static void pauseQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "foo";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      client.pauseQueue(queueName);
      System.out.println("Queue Paused.");
    }
  }
}

詳細については、Cloud Tasks リファレンスのキューの一時停止をご覧ください。

キューの削除

キューを削除した場合、同じ名前のキューを作成するまで 7 日間待つ必要があります。7 日間待てない場合は、キューからすべてのタスクを削除し、キューを再構成することを検討してください。

次の例では、キュー ID が foo のキューを削除しています。これは、タスクキューでキューを削除するに相当するクラウドタスクです。

gcloud

gcloud tasks queues delete foo

クライアント ライブラリ

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.QueueName;

public class DeleteQueue {
  public static void deleteQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "foo";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      client.deleteQueue(queueName);
      System.out.println("Queue Deleted.");
    }
  }
}

Cloud Tasks リファレンスのキューの削除をご覧ください。

タスクの作成と管理

このセクションでは、Cloud Tasks API を使用してタスクを作成および管理する方法について説明します。

タスクの作成

次の表に、タスクキューとクラウドタスクで異なるフィールドを示します。

Task Queues のフィールド Cloud Tasks のフィールド 説明
クラウドタスクの NEW app_engine_http_request App Engine サービスを対象とするリクエストを作成します。これらのタスクは App Engine タスクと呼ばれます。
method http_method リクエスト メソッド(たとえば、POST など)を指定します。
url relative_uri タスクハンドラを指定します。最後の文字の違いに注意してください。「l」(uniform resource locator)ではなく「i」(uniform resource identifier)です。
target app_engine_routing 省略可。App Engine タスクに対して、App Engine の serviceversioninstance を指定します。設定されていない場合は、デフォルトのサービス、バージョン、およびインスタンスが使用されます。

次の例では、デフォルトの App Engine サービスでハンドラ /worker にルーティングするタスクを作成します。これは、タスクキューでタスクを作成することと同等の Cloud Tasks です。

gcloud

gcloud tasks create-app-engine-task --queue=default \
--method=POST --relative-uri=/worker?key=key

クライアント ライブラリ

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import com.google.protobuf.ByteString;
import java.nio.charset.Charset;

public class CreateTask {
  public static void createTask(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "default";
      String key = "key";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      // Construct the task body.
      Task taskParam =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/worker?key=" + key)
                      .setHttpMethod(HttpMethod.GET)
                      .build())
              .build();

      Task taskPayload =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setBody(ByteString.copyFrom(key, Charset.defaultCharset()))
                      .setRelativeUri("/worker")
                      .setHttpMethod(HttpMethod.POST)
                      .build())
              .build();

      // Send create task request.
      Task[] tasks = new Task[] {taskParam, taskPayload};
      for (Task task : tasks) {
        Task response = client.createTask(queueName, task);
        System.out.println(response);
      }
    }
  }
}

詳細については、Cloud Tasks リファレンスの App Engine タスクの作成をご覧ください。

対象サービスとルーティングの指定

App Engine タスクに対して、App Engine のターゲット サービス、バージョン、インスタンスの指定はオプションです。デフォルトでは、App Engine のタスクは、タスクを実行するときにデフォルトのサービス、バージョン、インスタンスにルーティングされます。

タスクを作成する際に、タスクの app_engine_routing プロパティを設定して、タスクに別のApp Engineサービス、バージョン、またはインスタンスを指定します。

特定のキューで実行されているすべてのタスクを同じ App Engine のサービス、バージョン、インスタンスにルーティングするには、キューの app_engine_routing_override プロパティを設定します。

詳しくは、Cloud Tasks リファレンスのルーティングの構成をご覧ください。

データのハンドラへの引き渡し

タスクキューの場合と同様に、クラウドタスクを使用してハンドラにデータを渡す方法は 2 つあります。相対 URI でデータをクエリ パラメータとして渡す方法と、HTTP メソッドの POST または PUT を使用してリクエスト本文でデータを渡す方法があります。

クラウドタスクでは、タスクキューで「ペイロード」という用語を使用するのと同じ意味で、「本文」という用語を使用します。クラウドタスクでは、本文のコンテンツ タイプのデフォルトはプレーン テキストではなくオクテット ストリームです。本文コンテンツ タイプを設定するには、ヘッダーで指定します。

次の例では、2 つの異なる方法で、ハンドラ /worker にキーを渡しています。これは、タスクキューでハンドラにデータを渡すことに相当するクラウドタスクです。

Console

gcloud tasks create-app-engine-task --queue=default --method=GET  \
--relative-uri=/worker?key=blue --routing=service:worker
gcloud tasks create-app-engine-task --queue=default --method=POST \
--relative-uri=/worker --routing=service:worker \
--body-content="{'key': 'blue'}"

クライアント ライブラリ

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import com.google.protobuf.ByteString;
import java.nio.charset.Charset;

public class CreateTask {
  public static void createTask(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "default";
      String key = "key";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      // Construct the task body.
      Task taskParam =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/worker?key=" + key)
                      .setHttpMethod(HttpMethod.GET)
                      .build())
              .build();

      Task taskPayload =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setBody(ByteString.copyFrom(key, Charset.defaultCharset()))
                      .setRelativeUri("/worker")
                      .setHttpMethod(HttpMethod.POST)
                      .build())
              .build();

      // Send create task request.
      Task[] tasks = new Task[] {taskParam, taskPayload};
      for (Task task : tasks) {
        Task response = client.createTask(queueName, task);
        System.out.println(response);
      }
    }
  }
}

タスクに名前を付ける

タスク名の指定は省略可です。タスク名を指定しない場合、クラウドタスクによってタスク ID が生成され、タスクを作成する際に指定したキューに基づいてプロジェクトとロケーション(つまりリージョン)を推定することによりタスク名が作成されます。

タスク名の形式は projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID です。タスク名の TASK_ID の部分が Task Queues タスクの name フィールドと同等になります。

タスク名の再利用

タスク名を再利用する際には、待機する必要があります。待機する時間は、タスクをディスパッチするキューがクラウドタスクまたはタスクキューのどちらで作成されたかによって異なります。

タスクキューを使用して作成されたキュー(デフォルト キューを含む)のタスクの場合、元のタスクが削除または実行された後、約 9 日間待つ必要があります。クラウドタスクを使用して作成されたキューのタスクの場合は、元のタスクが削除または実行されてから約 1 時間待ちます。

次の例では、TASK_IDfirst-try に設定されたタスクを作成し、デフォルトのキューに追加します。クラウドタスクにおいてこれは、タスクキューの名前付けタスクに相当します。

gcloud

gcloud CLI では、構成からプロジェクトとロケーションを推測してタスク名が作成されます。

gcloud tasks create-app-engine-task first-try --queue=default \
--method=GET --relative-uri=/worker

クライアント ライブラリ

クライアント ライブラリでは、TASK_ID を指定する場合、完全なタスク名を指定する必要があります。プロジェクトとロケーションは、タスクが追加されるキューのプロジェクトとロケーションと一致する必要があります。

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import com.google.cloud.tasks.v2.TaskName;

public class CreateTaskWithName {
  public static void createTaskWithName(
      String projectId, String locationId, String queueId, String taskId) throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "default";
      // String taskId = "first-try"

      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      Task.Builder taskBuilder =
          Task.newBuilder()
              .setName(TaskName.of(projectId, locationId, queueId, taskId).toString())
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/worker")
                      .setHttpMethod(HttpMethod.GET)
                      .build());

      // Send create task request.
      Task response = client.createTask(queueName, taskBuilder.build());
      System.out.println(response);
    }
  }
}

失敗したタスクの再試行

タスクの再試行の設定は、キューの作成中に行うか、キューの更新によって設定できます。タスクキューのフィールドと、それぞれに対応するクラウドタスクのフィールドを次の表に示します。

Task Queues のフィールド Cloud Tasks のフィールド
task_retry_limit max_attempts
task_age_limit max_retry_duration
min_backoff_seconds min_backoff
max_backoff_seconds max_backoff
max_doublings max_doublings

タスク固有の再試行パラメータ

タスクキューで構成されたタスク固有の再試行パラメータはクラウドタスクでも機能しますが、編集や新規タスクの設定はできません。タスク固有の再試行パラメータを持つタスクの再試行パラメータを変更するには、目的の再試行パラメータを持つクラウド タスクキューを使用してタスクを再作成します。

次の例に、さまざまな再試行のシナリオを示します。

  • fooqueue では、タスクは最初の試行から 2 日間を期限とし、7 回を上限として再試行されます。両方の上限に達すると、タスクは完全に失敗し、再試行されなくなります。
  • barqueue では、App Engine は、再試行の回数に応じて間隔を長くしながらタスクを再試行し、最大バックオフに達すると、最大間隔で無限に再試行します(リクエストの間隔は 10 秒、20 秒、30 秒、...、190 秒、200 秒、200 秒、... となります)。
  • bazqueue では、再試行間隔は 10 秒から開始し、3 回 2 倍ずつ間隔を長くして、その後は直線的に間隔が広げられます。最終的には、最大間隔で無限に再試行します(リクエストの間隔は 10 秒、20 秒、40 秒、80 秒、160 秒、240 秒、300 秒、300 秒、... となります)。

クラウドタスクにおいてこれは、タスクキューの再試行タスクに相当します。

gcloud

秒数を指定するオプションを設定する場合は、整数の後に s を指定します(たとえば、200s200 など)。

gcloud tasks queues create fooqueue \
--max-attempts=7 \
--max-retry-duration=172800s  #2*60*60*24 seconds in 2 days
gcloud tasks queues create barqueue \
--min-backoff=10s \
--max-backoff=200s \
--max-doublings=0
gcloud tasks queues create bazqueue \
--min-backoff=10s \
--max-backoff=300s \
--max-doublings=3

クライアント ライブラリ

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.LocationName;
import com.google.cloud.tasks.v2.Queue;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.RateLimits;
import com.google.cloud.tasks.v2.RetryConfig;
import com.google.protobuf.Duration;

public class RetryTask {
  public static void retryTask(
      String projectId, String locationId, String fooqueue, String barqueue, String bazqueue)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String fooqueue = "fooqueue";
      // String barqueue = "barqueue";
      // String bazqueue = "bazqueue";

      LocationName parent = LocationName.of(projectId, locationId);

      Duration retryDuration = Duration.newBuilder().setSeconds(2 * 60 * 60 * 24).build();
      Duration min = Duration.newBuilder().setSeconds(10).build();
      Duration max1 = Duration.newBuilder().setSeconds(200).build();
      Duration max2 = Duration.newBuilder().setSeconds(300).build();

      Queue foo =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, fooqueue).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .setRetryConfig(
                  RetryConfig.newBuilder().setMaxAttempts(7).setMaxRetryDuration(retryDuration))
              .build();

      Queue bar =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, barqueue).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .setRetryConfig(
                  RetryConfig.newBuilder()
                      .setMinBackoff(min)
                      .setMaxBackoff(max1)
                      .setMaxDoublings(0))
              .build();

      Queue baz =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, bazqueue).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .setRetryConfig(
                  RetryConfig.newBuilder()
                      .setMinBackoff(min)
                      .setMaxBackoff(max2)
                      .setMaxDoublings(3))
              .build();

      Queue[] queues = new Queue[] {foo, bar, baz};
      for (Queue queue : queues) {
        Queue response = client.createQueue(parent, queue);
        System.out.println(response);
      }
    }
  }
}

詳細については、Cloud Tasks リファレンスの再試行パラメータの設定をご覧ください。

タスクのキューからの削除

タスクを削除した場合、次に同じ名前のタスクを作成するまで、タスクが queue.yaml ファイルを使用して作成されたキューにある場合は 9 日間、クラウドタスクを使用して作成されたキューにある場合は 1 時間、それぞれ待つ必要があります。

次の例では、キュー ID が queue1 のキューからタスク ID が foo のタスクを削除しています。これは、タスクキューにおいてタスクを削除するのと同等のクラウドタスクです。

gcloud

タスクのプロジェクトとロケーションは、gcloud CLI のデフォルト プロジェクトから推定されます。

gcloud tasks delete foo --queue=queue1

クライアント ライブラリ

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.TaskName;

public class DeleteTask {
  public static void deleteTask(String projectId, String locationId, String queueId, String taskId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "queue1";
      // String taskId = "foo";

      // Construct the fully qualified queue name.
      String taskName = TaskName.of(projectId, locationId, queueId, taskId).toString();

      client.deleteTask(taskName);
      System.out.println("Task Deleted.");
    }
  }
}

詳細については、Cloud Tasks リファレンスのタスクをキューから削除するをご覧ください。

タスクの完全な削除

次の例では、キュー ID が foo のキューからすべてのタスクを完全に削除しています。クラウドタスクにおいてこれは、タスクキューのタスクを完全に削除するに相当します。

gcloud

キューのプロジェクトとロケーションは、gcloud CLI のデフォルト プロジェクトから推定されます。

gcloud tasks queues purge foo

クライアント ライブラリ

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.QueueName;

public class PurgeQueue {
  public static void purgeQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "foo";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      client.purgeQueue(queueName);
      System.out.println("Queue Purged.");
    }
  }
}

詳細については、Cloud Tasks リファレンスのキューからすべてのタスクを完全に削除するをご覧ください。

Java 8 用 Cloud Tasks の例

次の例は、Cloud Tasks でキューを作成してタスクをキューに追加するための基本的な設定です。クライアント ライブラリのインポートのセクションで説明したように、デベロッパーが Cloud Tasks の依存関係を指定する pom.xml ファイルを作成していることを前提としています。Cloud Tasks において、これはタスクキューの Java 8 タスクキューの例に相当します。

タスクの作成とキューへの追加を行うファイルにより、タスクを作成し、Java 用 Cloud Tasks クライアント ライブラリを使用してデフォルト キューに追加します。

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
    name = "TaskEnqueue",
    description = "Enqueue a task targeted at endpoint '/cloudtasks/worker'",
    urlPatterns = "/cloudtasks/enqueue")
public class Enqueue extends HttpServlet {

  // TODO(developer): Replace these variables before running the sample.
  static final String projectId = "my-project-id";
  static final String locationId = "us-central1";

  // Function creates Cloud Tasks from form submissions.
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String key = request.getParameter("key");

    try (CloudTasksClient client = CloudTasksClient.create()) {
      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, "default").toString();

      // Construct the task body.
      Task task =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/cloudtasks/worker?key=" + key)
                      .setHttpMethod(HttpMethod.POST)
                      .build())
              .build();

      // Add the task to the default queue.
      Task taskResponse = client.createTask(queueName, task);
      System.out.println("Task created: " + taskResponse.getName());
    }

    response.sendRedirect("/");
  }
}

ワーカーを定義するファイルは、次のタスクを処理します。

import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
    name = "TaskWorker",
    description = "Endpoint to process Cloud Task requests",
    urlPatterns = "/cloudtasks/worker"
)
public class Worker extends HttpServlet {

  private static final Logger log = Logger.getLogger(Worker.class.getName());

  // Worker function to process POST requests from Cloud Tasks targeted at the
  // '/cloudtasks/worker' endpoint.
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String key = request.getParameter("key");
    log.info("Worker is processing " + key);
  }
}

次のステップ