Menggunakan antrean Cloud Tasks untuk melakukan buffering eksekusi alur kerja Anda


Tutorial ini menunjukkan cara membuat antrean Cloud Tasks yang dapat mengatur kecepatan eksekusi alur kerja.

Ada jumlah maksimum eksekusi alur kerja aktif yang dapat terjadi secara serentak. Setelah kuota ini habis, dan jika penundaan eksekusi dinonaktifkan, atau jika kuota untuk penundaan eksekusi tercapai, eksekusi baru akan gagal dengan kode status HTTP 429 Too many requests. Dengan mengaktifkan antrean Cloud Tasks untuk mengeksekusi alur kerja turunan dengan kecepatan yang Anda tentukan, Anda dapat menghindari masalah terkait kuota Alur Kerja dan mencapai tingkat eksekusi yang lebih baik.

Perhatikan bahwa Cloud Tasks dirancang untuk memberikan pengiriman "setidaknya sekali"; tetapi, Alur Kerja tidak memastikan pemrosesan permintaan duplikat dari Cloud Tasks tepat satu kali.

Dalam diagram berikut, alur kerja induk memanggil alur kerja turunan yang diatur oleh antrean Cloud Tasks yang menerapkan rasio pengiriman.

Alur kerja induk yang memanggil iterasi alur kerja turunan melalui
Antrean Cloud Tasks

Tujuan

Dalam tutorial ini, Anda akan:

  1. Buat antrean Cloud Tasks yang bertindak sebagai perantara antara alur kerja induk dan turunan.
  2. Buat dan deploy alur kerja turunan yang menerima data dari alur kerja induk.
  3. Buat dan deploy alur kerja induk yang menjalankan alur kerja turunan melalui antrean Cloud Tasks.
  4. Jalankan alur kerja induk tanpa batas kapasitas pengiriman, yang memanggil eksekusi alur kerja turunan.
  5. Terapkan batas pengiriman ke antrean Cloud Tasks dan jalankan alur kerja induk.
  6. Perhatikan bahwa alur kerja turunan dijalankan dengan kecepatan yang ditentukan melalui antrean Cloud Tasks.

Anda dapat menjalankan perintah berikut di konsol Google Cloud atau menggunakan Google Cloud CLI di terminal atau Cloud Shell.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

Batasan keamanan yang ditentukan oleh organisasi mungkin mencegah Anda menyelesaikan langkah-langkah berikut. Untuk mengetahui informasi pemecahan masalah, lihat Mengembangkan aplikasi di lingkungan Google Cloud yang terbatas.

Konsol

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  8. Di konsol Google Cloud, buka halaman IAM untuk menetapkan izin untuk akun layanan default Compute Engine.

    Buka IAM

    Catat akun layanan default Compute Engine karena Anda akan mengaitkannya dengan alur kerja dalam tutorial ini untuk tujuan pengujian. Akun layanan ini dibuat secara otomatis setelah mengaktifkan atau menggunakan layanan Google Cloud yang menggunakan Compute Engine, dan dengan format email berikut:

    PROJECT_NUMBER-compute@

    Ganti PROJECT_NUMBER dengan nomor project Google Cloud Anda. Anda dapat menemukan nomor project di halaman Welcome di konsol Google Cloud.

    Untuk lingkungan produksi, sebaiknya buat akun layanan baru dan berikan satu atau beberapa peran IAM berisi izin minimum yang diperlukan dan ikuti prinsip hak istimewa terendah.

  9. Pilih akun layanan default Compute Engine dan di baris tersebut, klik Edit principal.
  10. Di kotak dialog yang muncul, klik Tambahkan peran lain, lalu tambahkan peran berikut:
    1. Dalam daftar Select a role, pilih Workflows > Workflows Invoker sehingga akun tersebut memiliki izin untuk memicu eksekusi alur kerja Anda.
    2. Dalam daftar Select a role, pilih Cloud Tasks > Cloud Tasks Enqueuer sehingga akun tersebut memiliki izin untuk membuat tugas.
  11. Klik Simpan.

gcloud

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Cloud Tasks, Compute Engine, and Workflows APIs:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Cloud Tasks, Compute Engine, and Workflows APIs:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  12. Catat akun layanan default Compute Engine karena Anda akan mengaitkannya dengan alur kerja dalam tutorial ini untuk tujuan pengujian. Akun layanan ini dibuat secara otomatis setelah mengaktifkan atau menggunakan layanan Google Cloud yang menggunakan Compute Engine, dan dengan format email berikut:

    PROJECT_NUMBER-compute@

    Ganti PROJECT_NUMBER dengan nomor project Google Cloud Anda. Anda dapat menemukan nomor project dengan menjalankan perintah berikut:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    Untuk lingkungan produksi, sebaiknya buat akun layanan baru dan berikan satu atau beberapa peran IAM berisi izin minimum yang diperlukan dan ikuti prinsip hak istimewa terendah.

  13. Berikan peran Workflows Invoker (roles/workflows.invoker) pada project ke akun layanan default Compute Engine agar akun tersebut memiliki izin untuk memicu eksekusi alur kerja Anda.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@ \
        --role=roles/workflows.invoker

    Ganti kode berikut:

    • PROJECT_ID: project ID Google Cloud
    • PROJECT_NUMBER: nomor project Google Cloud

  14. Berikan peran Cloud Tasks Enqueuer (roles/cloudtasks.enqueuer) pada project ke akun layanan default Compute Engine agar akun tersebut memiliki izin untuk membuat tugas.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@ \
        --role=roles/cloudtasks.enqueuer

Membuat antrean Cloud Tasks

Buat antrean Cloud Tasks yang dapat Anda gunakan di alur kerja induk dan yang memungkinkan Anda mengatur kecepatan eksekusi alur kerja.

Konsol

  1. Di konsol Google Cloud, buka halaman Cloud Tasks:

    Buka Cloud Tasks

  2. Klik Buat antrean push.

  3. Masukkan Nama antrean, queue-workflow-child.

  4. Di daftar Region, pilih us-central1 (Iowa).

  5. Klik Create.

gcloud

QUEUE=queue-workflow-child
LOCATION=us-central1
gcloud tasks queues create $QUEUE --location=$LOCATION

Membuat dan men-deploy alur kerja turunan

Alur kerja turunan dapat menerima dan memproses data dari alur kerja induk. Buat dan deploy alur kerja turunan yang melakukan hal berikut:

  • Menerima iteration sebagai argumen
  • Tidur selama 10 detik untuk menyimulasikan beberapa pemrosesan
  • Menampilkan string setelah eksekusi berhasil

Konsol

  1. Di konsol Google Cloud, buka halaman Workflows.

    Buka Workflows

  2. Klik Buat.

  3. Masukkan nama, workflow-child, untuk alur kerja baru.

  4. Di daftar Region, pilih us-central1 (Iowa).

  5. Dalam daftar Service account, pilih Compute Engine default service account.

  6. Klik Berikutnya.

  7. Di editor alur kerja, masukkan definisi berikut untuk alur kerja Anda:

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  8. Klik Deploy.

gcloud

  1. Buat file kode sumber untuk alur kerja Anda:

    touch workflow-child.yaml
  2. Buka file kode sumber Anda di editor teks dan salin alur kerja berikut ke file.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  3. Deploy alur kerja:

    gcloud workflows deploy workflow-child \
        --source=workflow-child.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@

Membuat dan men-deploy alur kerja induk

Alur kerja induk mengeksekusi beberapa cabang alur kerja turunan menggunakan loop for.

  1. Salin kode sumber yang menentukan alur kerja induk:

    main:
      steps:
        - init:
            assign:
              - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
              - project_number: ${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
              - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
              - workflow_child_name: "workflow-child"
              - queue_name: "queue-workflow-child"
        - enqueue_tasks_to_execute_child_workflow:
            for:
              value: iteration
              range: [1, 100]
              steps:
                  - iterate:
                      assign:
                        - data:
                            iteration: ${iteration}
                        - exec:
                            # Encode object to JSON string in expression for workflow argument
                            argument: ${json.encode_to_string(data)}
                  - create_task_to_execute_child_workflow:
                      call: googleapis.cloudtasks.v2.projects.locations.queues.tasks.create
                      args:
                          parent: ${"projects/" + project_id + "/locations/" + location + "/queues/" + queue_name}
                          body:
                            task:
                              httpRequest:
                                body: ${base64.encode(json.encode(exec))}
                                url: ${"https://workflowexecutions.googleapis.com/v1/projects/" + project_id + "/locations/" + location + "/workflows/" + workflow_child_name + "/executions"}
                                oauthToken:
                                  serviceAccountEmail: ${project_number + "-compute@developer.gserviceaccount.com"}

    Alur kerja terdiri dari bagian berikut:

    • Peta yang digunakan untuk menetapkan konstanta yang merujuk ke alur kerja turunan dan nama antrean Cloud Tasks. Untuk mengetahui informasi selengkapnya, lihat Maps.

    • Loop for yang dijalankan untuk memanggil alur kerja turunan secara iteratif. Untuk informasi selengkapnya, lihat Iterasi.

    • Langkah alur kerja yang membuat dan menambahkan banyak tugas ke antrean Cloud Tasks untuk menjalankan alur kerja turunan. Untuk informasi selengkapnya, lihat konektor Cloud Tasks API.

  2. Deploy alur kerja:

    Konsol

    1. Di konsol Google Cloud, buka halaman Workflows:

      Buka Workflows

    2. Klik Buat.

    3. Masukkan nama, workflow-parent, untuk alur kerja baru.

    4. Di daftar Region, pilih us-central1 (Iowa).

    5. Dalam daftar Service account, pilih Compute Engine default service account.

    6. Klik Berikutnya.

    7. Di editor alur kerja, tempelkan definisi untuk alur kerja induk.

    8. Klik Deploy.

    gcloud

    1. Buat file kode sumber untuk alur kerja Anda:

      touch workflow-parent.yaml
    2. Buka file kode sumber di editor teks dan tempel definisi untuk alur kerja induk.

    3. Deploy alur kerja:

      gcloud workflows deploy workflow-parent \
          --source=workflow-parent.yaml \
          --location=us-central1 \
          --service-account=PROJECT_NUMBER-compute@

Menjalankan alur kerja induk tanpa batas kapasitas

Jalankan alur kerja induk untuk memanggil alur kerja turunan melalui antrean Cloud Tasks. Eksekusi akan memerlukan waktu sekitar 10 detik untuk diselesaikan.

Konsol

  1. Di konsol Google Cloud, buka halaman Workflows:

    Buka Workflows

  2. Di halaman Alur kerja, klik alur kerja workflow-parent untuk membuka halaman detailnya.

  3. Di halaman Workflow details, klik Execute.

  4. Klik Execute lagi.

  5. Saat alur kerja induk berjalan, kembali ke halaman Alur kerja, lalu klik alur kerja workflow-child untuk membuka halaman detailnya.

  6. Klik tab Executions.

    Anda akan melihat eksekusi alur kerja turunan, yang berjalan pada waktu yang sama, mirip dengan berikut ini:

    Detail eksekusi alur kerja turunan yang berjalan pada waktu yang sama.

gcloud

  1. Menjalankan alur kerja:

    gcloud workflows run workflow-parent \
         --location=us-central1
  2. Untuk memverifikasi bahwa eksekusi alur kerja dipicu, cantumkan empat eksekusi terakhir:

    gcloud workflows executions list workflow-child --limit=4

    Karena jumlah eksekusi (100 ) berada di bawah batas konkurensi Alur Kerja, hasilnya akan mirip dengan yang berikut ini. Masalah kuota dapat muncul jika Anda mengirimkan ribuan eksekusi secara bersamaan.

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/1570d06e-d133-4536-a859-b7b6a1a85524
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:15.093934448Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/82724960-7d92-4961-aa2c-a0f0be46212c
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.903007626Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/598126fb-37f9-45bc-91d8-aea7d795d702
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.698260524Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/d2e9960b-f93f-4df4-a594-3e7e5c2be53f
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.503818840Z
    END_TIME: 

Anda telah membuat dan men-deploy alur kerja yang memanggil 100 iterasi alur kerja turunan.

Menjalankan alur kerja induk dengan batas kapasitas

Terapkan batas kapasitas satu pengiriman per detik ke antrean Cloud Tasks, lalu jalankan alur kerja induk.

Konsol

  1. Di konsol Google Cloud, buka halaman Cloud Tasks:

    Buka Cloud Tasks

  2. Klik queue-workflow-child, antrean Cloud Tasks yang Anda buat, lalu klik Edit queue.

  3. Di bagian Batas kapasitas untuk pengiriman tugas, untuk kolom Max dispatches, ketik 1.

  4. Klik Simpan.

  5. Buka halaman Alur Kerja:

    Buka Workflows

  6. Klik alur kerja workflow-parent untuk membuka halaman detailnya.

  7. Di halaman Workflow details, klik Execute.

  8. Klik Execute lagi.

  9. Saat alur kerja induk berjalan, kembali ke halaman Alur kerja, lalu klik alur kerja workflow-child untuk membuka halaman detailnya.

  10. Klik tab Executions.

    Anda akan melihat eksekusi alur kerja turunan, yang berjalan pada satu permintaan per detik, mirip dengan berikut ini:

    Detail alur kerja turunan yang dijalankan berdasarkan permintaan per detik.

gcloud

  1. Perbarui antrean Cloud Tasks untuk menerapkan batas kapasitas satu pengiriman per detik:

    gcloud tasks queues update $QUEUE \
        --max-dispatches-per-second=1 \
        --location=us-central1
  2. Menjalankan alur kerja:

    gcloud workflows run workflow-parent \
       --location=us-central1
  3. Untuk memverifikasi bahwa eksekusi alur kerja dipicu, cantumkan empat eksekusi terakhir:

    gcloud workflows executions list workflow-child --limit=4

    Hasilnya akan mirip dengan berikut ini, dengan satu alur kerja yang dijalankan per detik:

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/becf4957-9fb2-40d9-835d-0ff2dd0c1249
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:24.446361457Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/6c1e7c4b-7ac6-4121-b351-1e2d56d10903
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:23.448213989Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/f2ba5027-af40-4cd3-8cd0-b8033bcc6211
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:22.431485914Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/ecc61ee5-fe87-49eb-8803-89dba929f6c8
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:21.443466369Z
    END_TIME: 

Anda telah berhasil men-deploy alur kerja yang memanggil 100 iterasi alur kerja turunan dengan kecepatan pengiriman satu eksekusi per detik.

Pembersihan

Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan ingin mempertahankannya tanpa perubahan yang ditambahkan dalam tutorial ini, hapus resource yang dibuat untuk tutorial.

Menghapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Untuk menghapus project:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Menghapus resource tutorial

Hapus alur kerja dan resource Cloud Tasks yang dibuat dalam tutorial ini:

Konsol

  • Untuk menghapus alur kerja, ikuti langkah-langkah berikut:

    1. Di konsol Google Cloud, buka halaman Workflows:

      Buka Workflows

    2. Dari daftar alur kerja, klik alur kerja untuk membuka halaman Detail alur kerja.

    3. Klik Delete.

    4. Ketik nama alur kerja, lalu klik Konfirmasi.

  • Untuk menghapus antrean Cloud Tasks, ikuti langkah-langkah berikut:

    1. Di konsol Google Cloud, buka halaman Cloud Tasks:

      Buka Cloud Tasks

    2. Pilih nama antrean yang ingin dihapus, lalu klik Delete queue.

    3. Konfirmasi tindakan.

gcloud

  • Untuk menghapus alur kerja, jalankan perintah berikut:

    gcloud workflows delete workflow-child
    gcloud workflows delete workflow-parent

  • Untuk menghapus antrean Cloud Tasks, jalankan perintah ini:

    gcloud tasks queues delete queue-workflow-child

Langkah selanjutnya