Memigrasikan push queue ke Cloud Tasks (Java)

Halaman ini menjelaskan cara memigrasikan kode push queue dari Task Queue ke Cloud Tasks. Cloud Tasks kini merupakan cara yang direkomendasikan untuk menangani push queue App Engine.

Dengan Cloud Tasks, Anda mengakses layanan yang sama dengan yang Anda akses menggunakan Task Queues RPC API. Artinya, Anda tidak perlu membuat ulang push queue dan tugas push yang sudah ada. Namun, Anda harus memigrasikan kode yang membuat atau berinteraksi dengan push queue atau tugas push untuk menggunakan Cloud Tasks API.

Anda dapat membuat dan berinteraksi dengan push queue dan tugas push menggunakan API RPC dan REST Cloud Tasks, library klien Cloud Tasks, Google Cloud CLI, dan Konsol Google Cloud. Halaman ini menyediakan contoh menggunakan gcloud CLI dan library klien Cloud Tasks.

Di Cloud Tasks, semua antrean beroperasi sebagai push queue. Di bagian lain panduan ini dan dalam dokumentasi Cloud Tasks, istilah antrean setara dengan istilah push queue. Demikian pula, istilah tugas setara dengan istilah tugas push.

Fitur yang tidak tersedia di Cloud Tasks

Fitur berikut tidak tersedia di Cloud Tasks:

  • Mengantrekan tugas dalam transaksi Datastore
  • Menggunakan library tugas yang ditangguhkan, sebagai ganti layanan worker
  • Mengerjakan tugas di aplikasi multi-tenant
  • Menyimulasikan dengan server pengembangan lokal
  • Menambahkan tugas secara asinkron

Harga dan kuota

Memigrasikan push queue ke Cloud Tasks dapat memengaruhi harga dan kuota untuk aplikasi Anda.

Harga

Cloud Tasks memiliki harga sendiri. Seperti halnya Task Queue, mengirim permintaan ke aplikasi App Engine dengan sebuah tugas dapat menyebabkan aplikasi dikenai biaya.

Kuota

Kuota Cloud Tasks berbeda dengan kuota untuk Task Queue. Seperti halnya Task Queue, mengirim permintaan ke aplikasi App Engine Anda dari Cloud Tasks dapat memengaruhi kuota permintaan App Engine Anda.

Sebelum bermigrasi

Bagian berikut membahas langkah-langkah penyiapan sebelum memigrasikan push queue ke Cloud Tasks.

Memigrasikan pull queue

Sebelum memulai, migrasikan pull queue sebelum mengikuti petunjuk dalam panduan ini untuk memigrasikan push queue. Memigrasikan pull queue setelah memigrasikan push queue tidak direkomendasikan karena penggunaan file queue.yaml yang diperlukan cenderung menyebabkan perilaku yang tidak terduga dengan Cloud Tasks.

Melindungi konfigurasi antrean

Setelah Anda memulai proses migrasi ke Cloud Tasks, mengubah file queue.yaml dapat menyebabkan perilaku yang tidak terduga dan tidak direkomendasikan. Lindungi konfigurasi antrean Anda dari modifikasi oleh file queue.yaml dengan langkah-langkah berikut.

  1. Konfigurasi gcloud CLI untuk menghapus file queue.yaml pada deployment mendatang.

    Tambahkan file queue.yaml Anda ke file .gcloudignore. Untuk memeriksa apakah Anda sudah memiliki file .gcloudignore, Anda dapat menjalankan perintah berikut di terminal Anda dari direktori level teratas aplikasi Anda. Perintah ini akan menghasilkan nama file jika file tersebut ada.

    ls -a | grep .gcloudignore

    Untuk mempelajari lebih lanjut file .gcloudignore, baca referensi .gcloudignore.

  2. Batasi izin pada file queue.yaml Anda.

    Ikuti praktik terbaik yang dijelaskan dalam panduan kami tentang mengamankan konfigurasi antrean.

  3. Pelajari Cloud Tasks dan file queue.yaml (opsional).

    Saat menggunakan Cloud Tasks API untuk mengelola konfigurasi antrean Anda, men-deploy file queue.yaml akan menggantikan konfigurasi yang ditetapkan oleh Cloud Tasks, yang dapat menyebabkan perilaku tidak terduga. Baca Menggunakan pengelolaan antrean versus queue.yaml untuk mempelajari lebih lanjut.

Mengaktifkan Cloud Tasks API

Untuk mengaktifkan Cloud Tasks API, klik Enable di Cloud Tasks API di Library API. Jika melihat tombol Manage, bukan tombol Enable, berarti Anda sebelumnya telah mengaktifkan Cloud Tasks API untuk project Anda dan tidak perlu melakukannya lagi.

Mengautentikasi aplikasi ke Cloud Tasks API

Anda harus mengautentikasi aplikasi ke Cloud Tasks API. Bagian ini membahas autentikasi untuk dua kasus penggunaan yang berbeda.

Untuk mengembangkan atau menguji aplikasi secara lokal, sebaiknya gunakan akun layanan. Untuk petunjuk tentang cara menyiapkan akun layanan dan menghubungkannya ke aplikasi Anda, baca Mendapatkan dan memberikan kredensial akun layanan secara manual.

Untuk men-deploy aplikasi di App Engine, Anda tidak perlu memberikan autentikasi baru. Kredensial Default Aplikasi (ADC) menyimpulkan detail autentikasi untuk aplikasi App Engine.

Mendownload gcloud CLI

Download dan instal gcloud CLI untuk menggunakan gcloud CLI dengan Cloud Tasks API jika Anda belum pernah menginstalnya. Jalankan perintah berikut dari terminal jika Anda sudah menginstal gcloud CLI.

gcloud components update

Mengimpor Library Klien Cloud

Untuk menggunakan library klien Cloud Tasks dengan aplikasi App Engine Anda:

  1. Tentukan dependensi library klien Cloud Tasks di file pom.xml Anda:

    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-tasks</artifactId>
      <version>1.3.0</version>
    </dependency>
  2. Impor dependensi library klien Cloud Tasks dalam file yang bertanggung jawab untuk membuat dan mengantrekan tugas Anda:

    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;

Membuat dan mengelola antrean

Bagian ini menjelaskan cara membuat dan mengelola antrean menggunakan Cloud Tasks API.

Dengan Cloud Tasks, Anda tidak menggunakan file queue.yaml untuk membuat atau mengelola antrean. Sebagai gantinya, Anda menggunakan Cloud Tasks API. Menggunakan file queue.yaml dan Cloud Tasks API tidak direkomendasikan, tetapi ini mungkin menjadi bagian yang tak terhindarkan dalam proses migrasi dari Task Queue ke Cloud Tasks, yang bergantung pada aplikasi Anda. Baca Menggunakan pengelolaan Antrean versus queue.yaml untuk mempelajari praktik terbaik.

Membuat antrean

Baca bagian ini jika aplikasi Anda membuat antrean secara terprogram, atau jika Anda ingin membuat antrean tambahan dari command line.

Di Cloud Tasks, nama antrean memiliki format projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID. Bagian LOCATION_ID pada nama antrean sesuai dengan region Google Cloud. Bagian QUEUE_ID dalam nama antrean setara dengan kolom name antrean Task Queue. Nama antrean dibuat selama pembuatan antrean berdasarkan project, region, dan QUEUE_ID yang Anda tentukan.

Secara umum, lokasi antrean (yaitu region) harus sama dengan region aplikasi Anda. Dua pengecualian untuk aturan ini adalah untuk aplikasi yang menggunakan region europe-west dan aplikasi yang menggunakan region us-central. Di Cloud Tasks, region ini masing-masing disebut europe-west1 dan us-central1.

Anda dapat menentukan konfigurasi antrean opsional selama pembuatan antrean, tetapi Anda juga dapat melakukannya dengan memperbarui antrean setelah dibuat.

Anda tidak perlu membuat ulang antrean yang ada. Sebagai gantinya, migrasikan kode yang berinteraksi dengan antrean yang ada dengan membaca bagian yang relevan dalam panduan ini.

Menggunakan kembali nama antrean

Anda harus menunggu 7 hari setelah menghapus antrean untuk membuat antrean dengan ID antrean yang sama di project dan lokasi yang sama (yaitu region).

Contoh berikut membuat dua antrean menggunakan Cloud Tasks. Antrean pertama memiliki ID antrean queue-blue, dan dikonfigurasi untuk mengirim semua tugas ke versi v2 layanan task-module dengan kecepatan 5/s. Antrean kedua memiliki ID antrean queue-red dan mengirim tugas dengan kecepatan 1/s. Keduanya dibuat pada project dengan project ID your-project-id di lokasi us-central1. Ini adalah Cloud Tasks yang setara dengan membuat antrean di Task Queues.

gcloud

gcloud CLI menyimpulkan project dan lokasi dari konfigurasi 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

library klien

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);
      }
    }
  }
}

Untuk mempelajari lebih lanjut, baca referensi Cloud Tasks Membuat antrean Cloud Tasks.

Menetapkan kecepatan pemrosesan antrean

Tabel berikut mencantumkan kolom yang berbeda dari Task Queue dengan Cloud Tasks.

Kolom Task Queue Kolom Cloud Tasks Deskripsi
rate max_dispatches_per_second Kecepatan maksimum saat tugas dikirim dari antrean
max_concurrent_requests max_concurrent_dispatches Jumlah maksimum tugas serentak yang dapat dikirim dari antrean
bucket_size max_burst_size

Cloud Tasks menghitung properti get-only max_burst_size yang membatasi seberapa cepat tugas dalam antrean diproses berdasarkan nilai max_dispatches_per_second. Kolom ini memungkinkan antrean memiliki kecepatan tinggi sehingga pemrosesan dimulai sesaat setelah tugas diantrekan, tetapi tetap membatasi penggunaan resource saat banyak tugas diantrekan dalam waktu singkat.

Untuk antrean App Engine yang dibuat atau diperbarui menggunakan file queue.xml/yaml, max_burst_size pada awalnya setara dengan bucket_size. Namun, jika antrean selanjutnya diteruskan ke perintah update menggunakan antarmuka Cloud Tasks apa pun, max_burst_size akan direset berdasarkan nilai max_dispatches_per_second, terlepas dari apakah max_dispatches_per_second sudah diperbarui.

total_storage_limit Tidak digunakan lagi di Cloud Tasks Cloud Tasks tidak mendukung penetapan batas penyimpanan kustom

Anda dapat menetapkan kecepatan pemrosesan antrean saat membuat antrean atau memperbaruinya setelah itu. Contoh berikut menggunakan Cloud Tasks untuk menetapkan kecepatan pemrosesan pada antrean bernama queue-blue yang telah dibuat. Jika queue-blue dibuat atau dikonfigurasi menggunakan file queue.yaml, contoh berikut akan mereset max_burst_size berdasarkan nilai max_dispatches_per_second dari 20. Ini adalah Cloud Tasks yang setara dengan menetapkan kecepatan pemrosesan antrean di Task Queue.

gcloud

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

library klien

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);
    }
  }
}

Untuk mempelajari lebih lanjut, lihat Menentukan pembatasan kapasitas.

Menonaktifkan dan melanjutkan antrean

Cloud Tasks menggunakan istilah jeda dengan cara yang sama seperti Task Queue menggunakan istilah nonaktifkan. Menjeda antrean akan menghentikan tugas dalam antrean agar tidak dijalankan hingga antrean dilanjutkan. Namun, Anda dapat terus menambahkan tugas ke antrean yang dijeda. Cloud Tasks menggunakan istilah lanjutkan dengan cara yang sama dengan Task Queue.

Contoh berikut menjeda antrean dengan ID antrean queueName . Ini adalah Cloud Tasks yang setara dengan menonaktifkan antrean di Task Queue.

gcloud

gcloud tasks queues pause 

queueName

library klien

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.");
    }
  }
}

Untuk mempelajari lebih lanjut, baca referensi Cloud Tasks Menjeda antrean.

Menghapus antrean

Setelah menghapus antrean, Anda harus menunggu 7 hari sebelum membuat antrean dengan nama yang sama. Sebaiknya hapus permanen semua tugas dari antrean dan konfigurasi ulang antrean jika Anda tidak dapat menunggu selama 7 hari.

Contoh berikut menghapus antrean dengan ID antrean foo . Ini adalah Cloud Tasks yang setara dengan menghapus antrean di Task Queue.

gcloud

gcloud tasks queues delete 

foo

library klien

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.");
    }
  }
}

Untuk mempelajari lebih lanjut, baca referensi Cloud Tasks Menghapus antrean.

Membuat dan mengelola tugas

Bagian ini menjelaskan cara membuat dan mengelola tugas menggunakan Cloud Tasks API.

Membuat tugas

Tabel berikut mencantumkan kolom yang berbeda dari Task Queue dengan Cloud Tasks.

Kolom Task Queue Kolom Cloud Tasks Deskripsi
BARU di Cloud Tasks app_engine_http_request Membuat permintaan yang menarget layanan App Engine. Tugas ini disebut sebagai tugas App Engine.
method http_method Menentukan metode permintaan; misalnya, POST
url relative_uri Menentukan pengendali tugas. Perhatikan perbedaan pada huruf terakhir: i untuk uniform resource identifier, dibandingkan l untuk uniform resource locator
target app_engine_routing Opsional. Menentukan App Engine service, version, dan instance untuk tugas App Engine. Jika tidak disetel, layanan, versi, dan instance default akan digunakan.

Contoh berikut membuat tugas yang dirutekan ke pengendali /worker pada layanan App Engine default. Ini adalah Cloud Tasks ini setara dengan membuat tugas di Task Queue.

gcloud

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

library klien

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);
      }
    }
  }
}

Untuk mempelajari lebih lanjut, baca referensi Cloud Tasks Membuat tugas App Engine.

Menentukan layanan dan perutean target

Penentuan layanan, versi, dan instance target App Engine untuk tugas App Engine bersifat opsional. Secara default, tugas App Engine dirutekan ke layanan, versi, dan instance yang merupakan default pada saat tugas dicoba.

Tetapkan properti app_engine_routing tugas selama pembuatan tugas untuk menentukan layanan, versi, atau instance App Engine yang berbeda untuk tugas Anda.

Untuk merutekan semua tugas pada antrean tertentu ke layanan, versi, dan instance App Engine yang sama, Anda dapat menetapkan properti app_engine_routing_override pada antrean.

Untuk mempelajari lebih lanjut, baca referensi Cloud Tasks Mengonfigurasi pemilihan rute.

Meneruskan data ke pengendali

Seperti Task Queue, Anda dapat meneruskan data ke pengendali dalam dua cara menggunakan Cloud Tasks. Anda dapat meneruskan data sebagai parameter kueri di URI relatif, atau meneruskan data dalam isi permintaan menggunakan metode HTTP POST atau PUT.

Cloud Tasks menggunakan istilah body dengan cara yang sama seperti Task Queue menggunakan istilah payload. Di Cloud Tasks, jenis konten isi default adalah aliran octet, bukan teks biasa. Anda dapat menetapkan jenis konten isi dengan menentukannya di header.

Contoh berikut meneruskan kunci ke pengendali /worker dengan dua cara berbeda. Ini adalah Cloud Tasks yang setara dengan meneruskan data ke pengendali di Task Queue.

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'}"

library klien

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);
      }
    }
  }
}

Memberi nama tugas

Menentukan nama tugas bersifat opsional. Jika Anda tidak menentukan nama tugas, Cloud Tasks akan membuatnya untuk Anda dengan membuat ID tugas serta menyimpulkan project dan lokasi (yaitu region) berdasarkan antrean yang Anda tentukan selama pembuatan tugas.

Nama tugas memiliki format projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID. Bagian TASK_ID dari nama tugas setara dengan kolom name tugas Task Queue.

Menggunakan kembali nama tugas

Anda harus menunggu sebelum menggunakan kembali nama tugas. Jumlah waktu yang harus Anda tunggu sebelum melakukannya berbeda-beda bergantung pada apakah antrean pengiriman tugas dibuat di Cloud Tasks atau Task Queue.

Untuk tugas pada antrean yang dibuat menggunakan Task Queue (termasuk antrean default), Anda harus menunggu sekitar 9 hari setelah tugas asli dihapus atau dieksekusi. Untuk tugas pada antrean yang dibuat menggunakan Cloud Tasks, Anda harus menunggu sekitar 1 jam setelah tugas asli dihapus atau dieksekusi.

Contoh berikut membuat tugas dengan TASK_ID yang ditetapkan ke first-try, dan menambahkannya ke antrean default. Ini adalah Cloud Tasks yang setara dengan memberi nama tugas di Task Queue.

gcloud

gcloud CLI membuat nama tugas dengan menyimpulkan project dan lokasi dari konfigurasi Anda.

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

/worker

library klien

Dengan library klien, Anda harus menentukan nama lengkap tugas jika ingin menentukan TASK_ID. Project dan lokasi harus cocok dengan project dan lokasi antrean tempat tugas ditambahkan.

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);
    }
  }
}

Mencoba lagi tugas yang gagal

Anda dapat menetapkan konfigurasi percobaan ulang tugas pada antrean selama pembuatan antrean, atau dengan memperbarui antrean. Tabel berikut mencantumkan kolom Task Queues dan kolom Cloud Tasks yang sesuai.

Kolom Task Queue Kolom 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

Parameter percobaan ulang khusus tugas

Parameter percobaan ulang khusus tugas yang dikonfigurasi di Task Queue berfungsi di Cloud Tasks, tetapi Anda tidak dapat mengeditnya atau menetapkannya pada tugas baru. Guna mengubah parameter percobaan ulang untuk tugas yang memiliki parameter percobaan ulang khusus tugas, buat ulang tugas dengan antrean Cloud Tasks yang memiliki parameter percobaan ulang yang diinginkan.

Contoh berikut menunjukkan berbagai skenario percobaan ulang:

  • Dalam fooqueue, tugas dicoba ulang hingga tujuh kali dan hingga dua hari sejak upaya eksekusi pertama. Setelah kedua batas terlampaui, kedua batas tersebut akan gagal secara permanen.
  • Dalam barqueue, App Engine akan berupaya mencoba ulang tugas, dengan meningkatkan interval secara linear antara setiap percobaan ulang hingga mencapai backoff maksimum dan mencoba lagi tanpa batas waktu pada interval maksimum (sehingga interval antarpermintaan adalah 10 dtk, 20 dtk, 30 dtk, ..., 190 dtk, 200 dtk, 200 dtk, ...).
  • Dalam bazqueue, interval percobaan ulang dimulai pada 10 detik, lalu dua kali lipat tiga kali, lalu meningkat secara linear, dan akhirnya mencoba lagi tanpa batas waktu pada interval maksimum (sehingga interval antarpermintaan adalah 10 dtk, 20 dtk, 40 dtk, 80 dtk, 160 dtk, 240 dtk, 300 dtk, 300 dtk, ...).

Ini adalah Cloud Tasks yang setara dengan mencoba ulang tugas di Task Queue.

gcloud

Saat menyetel opsi yang menentukan jumlah detik, Anda harus menyertakan s setelah angka bilangan bulat (misalnya 200s, bukan 200).

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

library klien

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);
      }
    }
  }
}

Untuk mempelajari lebih lanjut, baca referensi Cloud Tasks Menetapkan parameter percobaan ulang.

Menghapus tugas dari antrean

Saat menghapus tugas, Anda harus menunggu 9 hari sebelum membuat tugas dengan nama yang sama jika tugas berada di antrean yang dibuat menggunakan file queue.yaml, atau 1 jam jika tugas berada di antrean yang dibuat menggunakan Cloud Tasks.

Contoh berikut menghapus tugas dengan ID tugas foo dari antrean dengan ID antrean queue1. Ini adalah Cloud Tasks yang setara dengan menghapus tugas di Task Queue.

gcloud

Project tugas dan lokasi disimpulkan dari project default gcloud CLI.

gcloud tasks delete foo --queue=queue1

library klien

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.");
    }
  }
}

Untuk mempelajari lebih lanjut, baca referensi Cloud Tasks Menghapus tugas dari antrean.

Menghapus permanen tugas

Contoh berikut menghapus permanen semua tugas dari antrean dengan ID antrean foo . Ini adalah Cloud Tasks yang setara dengan menghapus permanen tugas di Task Queue.

gcloud

Project antrean dan lokasi disimpulkan dari project default gcloud CLI.

gcloud tasks queues purge 

foo

library klien

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.");
    }
  }
}

Untuk mempelajari lebih lanjut, baca referensi Cloud Tasks Menghapus permanen semua tugas dari antrean.

Contoh Cloud Tasks Java 8

Contoh berikut adalah penyiapan dasar untuk membuat antrean dan mengantrekan tugas dengan Cloud Tasks. Hal ini mengasumsikan bahwa developer telah membuat file pom.xml untuk menentukan dependensi Cloud Tasks seperti yang dijelaskan di bagian Mengimpor library klien. Ini adalah Cloud Tasks yang setara dengan contoh task queue Java 8 di Task Queue.

File yang bertanggung jawab untuk membuat dan mengantrekan tugas membuat tugas dan menambahkannya ke antrean default menggunakan library klien 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("/");
  }
}

File yang menentukan pekerja akan menangani tugas:

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);
  }
}

Langkah selanjutnya