Buffering permintaan HTTP dengan Cloud Tasks

1. Pengantar

c6ac6ed05292f13e.png

Cloud Tasks adalah layanan antrean terkelola sepenuhnya untuk mengelola eksekusi, pengiriman, dan penayangan tugas dalam jumlah besar.

Cloud Tasks memungkinkan Anda memisahkan bagian-bagian pekerjaan, yang disebut tugas, yang dapat dilakukan secara independen (misalnya, tugas untuk memperbarui entri database), di luar alur aplikasi utama, dan mengirimkannya untuk diproses, secara asinkron, menggunakan pengendali yang Anda buat.

Tugas yang dialihkan ditambahkan ke antrean, yang mempertahankan tugas hingga berhasil dieksekusi atau mengalami kegagalan. Berdasarkan konfigurasi, antrean juga dapat bertindak sebagai kontrol alur pengiriman. Anda dapat membuat dan mengonfigurasi antrean yang kemudian dikelola oleh layanan Cloud Tasks. Setelah tugas ditambahkan, antrean akan mengirim tugas dan memastikan pekerja memprosesnya dengan andal.

d59ffe8d34138c88.png

Beberapa fitur utama Cloud Tasks adalah:

  • Target HTTP: Tambahkan tugas yang menarget layanan HTTP apa pun yang berjalan di Compute Engine, Google Kubernetes Engine, Cloud Run, Cloud Functions, atau sistem lokal secara aman menggunakan autentikasi OAuth/OIDC standar industri.
  • Penghapusan duplikat tugas: Tugas yang ditambahkan beberapa kali hanya akan dikirim sekali.
  • Pengiriman terjamin: Tugas dijamin akan dikirim minimal satu kali dan sebagian besar tugas ditayangkan tepat satu kali.
  • Kontrol tingkat dan percobaan ulang: Kontrol eksekusi dengan menetapkan tingkat pengiriman tugas, jumlah maksimum percobaan, dan waktu tunggu minimum antar-percobaan.
  • Penjadwalan mendatang: Mengontrol waktu saat tugas dijalankan.

Dalam codelab ini, Anda akan terlebih dahulu mempelajari cara membuat dan menggunakan antrean Cloud Tasks reguler untuk tugas target HTTP. Kemudian, Anda akan mempelajari cara menggunakan penggantian URI HTTP tingkat antrean dan BufferTask API baru untuk melakukan buffering permintaan HTTP dengan lebih mudah menggunakan Cloud Tasks.

Yang akan Anda pelajari

  • Cara membuat tugas target HTTP.
  • Cara membuat tugas target HTTP dengan penggantian URI HTTP tingkat antrean yang baru.
  • Cara mengubah tugas yang tertunda dengan penggantian URI HTTP tingkat antrean yang baru.
  • Cara lebih mudah melakukan buffering permintaan HTTP dengan BufferTask API baru.

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.

Dari Google Cloud Console, klik ikon Cloud Shell di toolbar kanan atas:

55efc1aaa7a4d3ad.png

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

7ffe5cbb04455448.png

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda dalam codelab ini dapat dilakukan di browser. Anda tidak perlu menginstal apa pun.

3. Membuat antrean reguler untuk tugas target HTTP

Pada langkah pertama ini, Anda akan mempelajari cara membuat antrean Cloud Tasks reguler dan menambahkan tugas HTTP ke antrean tersebut untuk menargetkan layanan Cloud Run.

d4f09a342c8eab.png

Apa yang dimaksud dengan tugas target HTTP?

Tugas target HTTP dapat menargetkan layanan HTTP apa pun yang berjalan di Compute Engine, Google Kubernetes Engine, Cloud Run, Cloud Functions, atau sistem lokal secara aman menggunakan autentikasi OAuth/OIDC standar industri.

Deploy layanan Cloud Run

Pertama, pastikan API yang diperlukan diaktifkan:

gcloud services enable \
  cloudtasks.googleapis.com \
  run.googleapis.com

Deploy layanan Cloud Run yang akan berfungsi sebagai target tugas HTTP:

SERVICE1=hello1
REGION=us-central1

gcloud run deploy $SERVICE1 \
  --allow-unauthenticated \
  --image=gcr.io/cloudrun/hello \
  --region=$REGION

Membuat antrean Cloud Tasks

Buat antrean Cloud Tasks reguler:

QUEUE1=http-queue
LOCATION=us-central1

gcloud tasks queues create $QUEUE1 --location=$LOCATION

Jeda antrean untuk sementara, sehingga Anda dapat mengamati tugas HTTP saat dibuat:

gcloud tasks queues pause $QUEUE1 --location=$LOCATION

4. Membuat dan menguji tugas HTTP

Pada langkah ini, Anda akan membuat tugas HTTP untuk menargetkan antrean yang telah dibuat sebelumnya.

Membuat tugas HTTP

Anda dapat membuat tugas HTTP menggunakan gcloud:

gcloud tasks create-http-task \
    --queue=$QUEUE1 \
    --location=$LOCATION \
    --url=$SERVICE1_URL \
    --method=GET

Opsional: Anda juga dapat membuat tugas HTTP dengan library klien. Misalnya, Anda dapat melihat Program.cs untuk contoh C# dengan permintaan HTTP yang digabungkan ke Task dan TaskRequest sebelum dikirim ke Cloud Tasks dengan CloudTasksClient:

var taskRequest = new CreateTaskRequest
{
    Parent = new QueueName(projectId, location, queue).ToString(),
    Task = new Task
    {
        HttpRequest = new HttpRequest
        {
            HttpMethod = HttpMethod.Get,
            Url = url
        }
    }
};

var client = CloudTasksClient.Create();
var response = client.CreateTask(taskRequest);

Anda dapat menjalankannya seperti berikut untuk membuat dan menambahkan tugas ke antrean:

dotnet run $PROJECT_ID $LOCATION $QUEUE1 $SERVICE1_URL

Menguji tugas HTTP

Pada tahap ini, tugas dibuat, tetapi belum dieksekusi karena antrean dijeda. Anda dapat memverifikasinya dengan membuat daftar antrean:

gcloud tasks queues list --location=$LOCATION

Anda akan melihat antrean dalam status PAUSED:

QUEUE_NAME  STATE
http-queue  PAUSED

Lanjutkan antrean:

gcloud tasks queues resume $QUEUE --location=$LOCATION

Periksa log layanan Cloud Run:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1

Anda akan melihat bahwa layanan Cloud Run menerima permintaan GET HTTP dari Cloud Tasks:

httpRequest:
  latency: 0.227597158s
  protocol: HTTP/1.1
  remoteIp: 35.243.23.192
  requestMethod: GET
  requestSize: '415'
  requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/
  responseSize: '5510'
  serverIp: 216.239.32.53
  status: 200
  userAgent: Google-Cloud-Tasks

5. Membuat antrean dengan konfigurasi pemilihan rute

Pada langkah ini, Anda akan mempelajari cara membuat antrean Cloud Tasks dengan konfigurasi perutean untuk menambahkan penggantian URI HTTP menggunakan fitur Konfigurasi Pemilihan Rute Tugas Tingkat Antrean. Kemudian, Anda akan menambahkan tugas HTTP ke dalamnya untuk menargetkan layanan Cloud Run pertama dan mengamati bahwa konfigurasi perutean mengganti URI untuk merutekan tugas ke layanan Cloud Run kedua.

5d1ec61a933f77.pngS

Apa yang dimaksud dengan Konfigurasi Pemilihan Rute Tugas Tingkat Antrean?

Konfigurasi Perutean Tugas tingkat antrean mengubah perutean tugas HTTP untuk seluruh antrean untuk semua tugas yang tertunda dan baru. Hal ini memudahkan pembuatan tugas karena target HTTP tidak perlu ditetapkan di level tugas dan mengalihkan lebih banyak kontrol ke penyedia layanan karena mereka dapat menetapkan target semua tugas dalam antrean (misalnya, merutekan traffic ke backend yang berbeda jika backend asli tidak aktif).

Konfigurasi berikut dapat ditetapkan di tingkat antrean:

  • Header: Header tingkat antrean saat ditentukan di tingkat antrean akan memperbarui header untuk semua tugas dalam antrean.
  • Metode HTTP: Metode HTTP bila ditetapkan di tingkat antrean, akan menggantikan metode HTTP untuk semua tugas dalam antrean.
  • URI Target: Host, jalur, kueri, port, skema (HTTP atau HTTPS) dapat diganti satu per satu.
  • Otorisasi: Konfigurasi OIDC/OAuth saat ditentukan di tingkat antrean akan mengganti konfigurasi OIDC/OAuth tingkat tugas.

Men-deploy layanan Cloud Run kedua

Deploy layanan Cloud Run kedua yang nantinya akan berfungsi sebagai target penggantian URI HTTP:

SERVICE2=hello2
REGION=us-central1

gcloud run deploy $SERVICE2 \
  --allow-unauthenticated \
  --image=gcr.io/cloudrun/hello \
  --region=$REGION

Simpan host URL layanan untuk digunakan nanti:

SERVICE2_URL=$(gcloud run services describe $SERVICE2 --region $REGION --format 'value(status.url)')
SERVICE2_HOST=$(echo $SERVICE2_URL | sed 's,http[s]*://,,g')

Membuat antrean Cloud Tasks dengan konfigurasi pemilihan rute

Buat antrean dengan konfigurasi pemilihan rute dengan penggantian URI HTTP ke layanan Cloud Run kedua.

QUEUE2=http-queue-uri-override

gcloud beta tasks queues create $QUEUE2 \
  --http-uri-override=host:$SERVICE2_HOST \
  --location=$LOCATION

Perhatikan bahwa penggantian URI mengacu pada layanan Cloud Run kedua. Setiap tugas HTTP yang ditambahkan ke antrean akan mengganti host URI aslinya. Anda dapat melihat konfigurasi antrean:

gcloud beta tasks queues describe $QUEUE2 --location=$LOCATION

Anda akan melihat bahwa httpTarget memiliki uriOverride yang mengarah ke host layanan kedua:

httpTarget:
  uriOverride:
    host: hello2-idcwffc3yq-uc.a.run.app
    pathOverride: {}
    queryOverride: {}
...

Jeda antrean untuk sementara, sehingga Anda dapat mengamati tugas HTTP saat dibuat:

gcloud tasks queues pause $QUEUE2 --location=$LOCATION

6. Membuat dan menguji tugas HTTP untuk antrean dengan konfigurasi perutean

Pada langkah ini, Anda akan membuat tugas HTTP untuk menargetkan layanan pertama dan mengamati bahwa URI-nya diganti oleh antrean untuk mengarah ke layanan kedua.

Membuat tugas HTTP

Buat tugas HTTP dengan URL layanan pertama:

gcloud tasks create-http-task \
    --queue=$QUEUE2 \
    --location=$LOCATION \
    --url=$SERVICE1_URL \
    --method=GET

Menguji tugas HTTP

Lanjutkan antrean:

gcloud tasks queues resume $QUEUE2 --location=$LOCATION

Anda akan melihat bahwa layanan Cloud Run kedua (bukan yang pertama) menerima permintaan GET HTTP dari Cloud Tasks karena penggantian:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE2" --limit 1
---
httpRequest:
  latency: 0.228982142s
  protocol: HTTP/1.1
  remoteIp: 35.187.132.84
  requestMethod: GET
  requestSize: '426'
  requestUrl: https://hello2-idcwffc3yq-uc.a.run.app/
  responseSize: '5510'
  serverIp: 216.239.34.53
  status: 200
  userAgent: Google-Cloud-Tasks

7. Mengubah tugas yang tertunda dengan konfigurasi perutean

Anda juga dapat menggunakan konfigurasi perutean untuk mengubah URI HTTP dari semua tugas yang tertunda dalam antrean. Hal ini berguna jika layanan backend tidak aktif dan Anda ingin merutekan ke layanan lain dengan cepat. Mari kita lihat cara kerjanya dalam langkah ini.

Jeda antrean lagi:

gcloud tasks queues pause $QUEUE2 --location=$LOCATION

Buat tugas HTTP dengan google.com sebagai URL tugas:

gcloud tasks create-http-task \
    --queue=$QUEUE2 \
    --location=$LOCATION \
    --url=https://www.google.com \
    --method=GET

Tugas ini berstatus tertunda karena antrean dijeda.

Sekarang, update penggantian URI HTTP agar mengarah ke layanan pertama. Tindakan ini akan mengganti host tugas yang tertunda dari google.com ke host layanan pertama:

SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)')
SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g')

gcloud beta tasks queues update $QUEUE2 \
  --http-uri-override=host:$SERVICE1_HOST \
  --location=$LOCATION

Lanjutkan antrean:

gcloud tasks queues resume $QUEUE2 --location=$LOCATION

Anda akan melihat bahwa layanan Cloud Run pertama menerima permintaan GET HTTP dari Cloud Tasks karena penggantian (bukan google.com):

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1
---
httpRequest:
  latency: 0.228982142s
  protocol: HTTP/1.1
  remoteIp: 35.187.132.84
  requestMethod: GET
  requestSize: '426'
  requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/
  responseSize: '5510'
  serverIp: 216.239.34.53
  status: 200
  userAgent: Google-Cloud-Tasks

8. Membuat antrean untuk BufferTask API

Biasanya, Anda membuat tugas dengan menggunakan Tasks API dari gcloud atau library klien Tasks. Hal ini membebani aplikasi untuk menggabungkan permintaan HTTP ke dalam Tasks menggunakan library klien dan juga menciptakan dependensi antara aplikasi dan library klien Tasks.

Pada langkah ini, Anda akan melihat cara memanfaatkan penggantian URI HTTP tingkat antrean dan BufferTask API baru untuk membuat tugas target HTTP secara lebih mudah hanya dengan mengirimkan permintaan HTTP. Aplikasi apa pun yang dapat mengirim permintaan HTTP sekarang dapat membuat tugas target HTTP.

b1606516297fc4b6.png

Apa itu BufferTask API?

CreateTask API adalah cara lama untuk membuat Tasks dan mengharuskan klien mengirim objek Task ke API dengan semua kolom wajib diisi yang telah ditetapkan.

BufferTask API adalah fitur baru yang memungkinkan pengguna membuat Tugas HTTP tanpa perlu menyediakan Konfigurasi Tugas (URL HTTP, header, otorisasi), sehingga Anda cukup mengirimkan pesan atau isi permintaan ke Buffer API.

Hal ini memungkinkan integrasi yang lebih mudah dengan layanan karena Cloud Tasks kini dapat di-deploy di depan layanan Anda tanpa memerlukan perubahan kode di sisi klien. Setiap permintaan HTTP arbitrer yang dikirim ke BufferTask API akan digabungkan sebagai objek Task dan dikirimkan ke tujuan yang ditetapkan pada tingkat antrean.

Untuk menggunakan BufferTask API, antrean harus memiliki konfigurasi URI Target, atau dengan kata lain, fitur Konfigurasi Pemilihan Rute Tingkat Antrean adalah prasyarat untuk menggunakan BufferTask API.

Membuat antrean Cloud Tasks dengan konfigurasi perutean

Buat antrean dengan konfigurasi pemilihan rute yang mengarah ke layanan pertama yang kita deploy di langkah sebelumnya:

SERVICE1=hello1
SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)')
SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g')
QUEUE3=http-queue-uri-override-buffer

gcloud beta tasks queues create $QUEUE3 \
  --http-uri-override=host:$SERVICE1_HOST \
  --location=$LOCATION

Jeda antrean untuk sementara, sehingga Anda dapat mengamati tugas HTTP saat dibuat:

gcloud tasks queues pause $QUEUE3 --location=$LOCATION

9. Buffering permintaan HTTP dengan BufferTask API

Pada langkah ini, Anda akan melakukan buffering permintaan GET atau POST HTTP sederhana dengan BufferTask API. Di balik layar, Cloud Tasks akan menggabungkan permintaan HTTP ini ke dalam tugas HTTP dengan setelan konfigurasi pemilihan rute default dalam antrean.

Pertama-tama, login untuk mendapatkan token akses dan menetapkan beberapa variabel:

gcloud auth application-default login
ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
PROJECT_ID=$(gcloud config get-value project)
TASKS_QUEUES_API="https://cloudtasks.googleapis.com/v2beta3/projects/$PROJECT_ID/locations/$LOCATION/queues"

Membuat tugas HTTP

Buat tugas HTTP dengan BufferTask API. Perhatikan bahwa permintaan GET HTTP dapat dibuat tanpa perlu membuat Task:

curl -X GET "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Buat tugas HTTP lain dengan HTTP POST dan isi:

curl -X POST "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d "{'message': 'Hello World'}"

Opsional: Anda juga dapat membuat tugas HTTP dengan library klien. Misalnya, Anda dapat melihat Program.cs untuk contoh C# tempat permintaan GET HTTP dikirim langsung ke BufferTask API tanpa harus menggabungkannya ke dalam Task atau memerlukan library klien untuk Cloud Tasks:

var BufferTaskApiUrl = $"https://cloudtasks.googleapis.com/v2beta3/projects/{ProjectId}/locations/{Location}/queues/{Queue}/tasks:buffer";

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Authorization", $"Bearer {AccessToken}");
    var response = await client.GetAsync(BufferTaskApiUrl);
    var content = await response.Content.ReadAsStringAsync();
    Console.WriteLine($"Response: {content}");
}

Anda dapat menjalankannya sebagai berikut:

dotnet run $PROJECT_ID $LOCATION $QUEUE3 $ACCESS_TOKEN

BufferTask API menangani pembuatan Tugas dari permintaan HTTP dan menambahkan URL dari setelan konfigurasi perutean antrean untuk URI.

Menguji tugas HTTP

Lanjutkan antrean:

gcloud tasks queues resume $QUEUE3 --location=$LOCATION

Anda akan melihat bahwa layanan Cloud Run menerima permintaan GET dan POST HTTP dari Cloud Tasks:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 4
---
httpRequest:
  latency: 0.002279292s
  protocol: HTTP/1.1
  remoteIp: 35.243.23.42
  requestMethod: POST
  requestSize: '777'
  requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/
  responseSize: '5450'
  serverIp: 216.239.32.53
  status: 200
  userAgent: Google-Cloud-Tasks
...
httpRequest:
  latency: 0.228982142s
  protocol: HTTP/1.1
  remoteIp: 35.187.132.84
  requestMethod: GET
  requestSize: '426'
  requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/
  responseSize: '5510'
  serverIp: 216.239.34.53
  status: 200
  userAgent: Google-Cloud-Tasks

10. Selamat

Selamat, Anda telah menyelesaikan codelab!

Sebagai tindak lanjut, Anda dapat mencoba Cloud Tasks sebagai buffer antara Pub/Sub dan Cloud Run untuk melihat contoh nyata tentang bagaimana fitur baru Cloud Tasks ini dapat membantu membuat antrean buffer antarlayanan dengan mudah.

Pembersihan (Opsional)

Untuk menghindari timbulnya biaya, sebaiknya bersihkan sumber daya.

Jika tidak memerlukan project, Anda cukup menghapus project:

gcloud projects delete $PROJECT_ID

Jika memerlukan project, Anda dapat menghapus resource satu per satu.

Hapus layanan Cloud Run:

gcloud run services delete $SERVICE1 --region $REGION
gcloud run services delete $SERVICE2 --region $REGION

Hapus antrean Cloud Tasks:

gcloud tasks queues delete $QUEUE1 --location=$LOCATION
gcloud tasks queues delete $QUEUE2 --location=$LOCATION
gcloud tasks queues delete $QUEUE3 --location=$LOCATION

Yang telah kita bahas

  • Cara membuat tugas target HTTP.
  • Cara membuat tugas target HTTP dengan penggantian URI HTTP tingkat antrean yang baru.
  • Cara mengubah tugas yang tertunda dengan penggantian URI HTTP tingkat antrean yang baru.
  • Cara lebih mudah melakukan buffering permintaan HTTP dengan BufferTask API baru.