Buffering permintaan HTTP dengan Cloud Tasks

1. Pengantar

c6ac6ed05292f13e.png

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

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

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

d59ffe8d34138c88.png

Beberapa fitur utama Cloud Tasks adalah:

  • Target HTTP: Tambahkan tugas yang 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.
  • Penghapusan duplikat tugas: Tugas yang ditambahkan beberapa kali hanya akan dikirim sekali.
  • Pengiriman terjamin: Tugas dijamin akan dikirimkan setidaknya satu kali dan sebagian besar tugas dikirimkan tepat satu kali.
  • Kontrol kecepatan dan percobaan ulang: Kontrol eksekusi dengan menetapkan kecepatan pengiriman tugas, jumlah maksimum percobaan, dan waktu tunggu minimum antar-percobaan.
  • Penjadwalan mendatang: Kontrol waktu kapan tugas akan dijalankan.

Dalam codelab ini, Anda akan mempelajari terlebih dahulu 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 mem-buffer 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 tertunda dengan penggantian URI HTTP tingkat antrean yang baru.
  • Cara mem-buffer permintaan HTTP dengan lebih mudah menggunakan 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 Anda buat 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# tempat permintaan HTTP di-wrap ke dalam 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 sebagai 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 mencantumkan 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 HTTP GET 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 perutean

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

5d1ec61a933f77.png

Apa yang dimaksud dengan Konfigurasi Pemilihan Rute Tugas Tingkat Antrean?

Konfigurasi Perutean Tugas tingkat Antrean mengubah perutean tugas HTTP untuk seluruh antrean bagi semua tugas yang tertunda dan baru. Hal ini memungkinkan pembuatan tugas yang lebih mudah karena target HTTP tidak perlu ditetapkan di tingkat tugas dan memberikan lebih banyak kontrol kepada penyedia layanan karena mereka dapat menetapkan target semua tugas dalam antrean (misalnya, mengarahkan traffic ke backend lain jika backend asli tidak berfungsi).

Konfigurasi berikut dapat ditetapkan di tingkat antrean:

  • Header: Header tingkat antrean jika ditentukan di tingkat antrean, akan meng-upsert header untuk semua tugas dalam antrean.
  • Metode HTTP: Metode HTTP saat ditentukan 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 jika ditentukan di tingkat antrean akan menggantikan konfigurasi OIDC/OAuth tingkat tugas.

Men-deploy layanan Cloud Run kedua

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

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 perutean 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 merujuk ke layanan Cloud Run kedua. Setiap tugas HTTP yang ditambahkan ke antrean akan menggantikan 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. Buat dan uji tugas HTTP untuk antrean dengan konfigurasi pemilihan rute

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 HTTP GET 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 tertunda dengan konfigurasi perutean

Anda juga dapat menggunakan konfigurasi perutean untuk mengubah URI HTTP semua tugas yang tertunda dalam antrean. Hal ini berguna jika layanan backend tidak berfungsi dan Anda ingin mengarahkan traffic dengan cepat ke layanan lain. Mari kita lihat cara kerjanya di 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 dalam status tertunda karena antrean dijeda.

Sekarang, perbarui penggantian URI HTTP agar mengarah ke layanan pertama. Tindakan ini akan menggantikan 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 HTTP GET 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 menggunakan Tasks API baik dari gcloud maupun library klien Tasks. Hal ini membebani aplikasi untuk membungkus permintaan HTTP ke dalam Tugas menggunakan library klien dan juga membuat 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 dengan lebih mudah hanya dengan mengirim permintaan HTTP. Aplikasi apa pun yang dapat mengirim permintaan HTTP kini dapat membuat tugas target HTTP.

b1606516297fc4b6.png

Apa itu BufferTask API?

CreateTask API adalah cara lama untuk membuat Tugas dan mengharuskan klien mengirimkan objek Tugas ke API dengan semua kolom yang diperlukan ditetapkan.

BufferTask API adalah fitur baru yang memungkinkan pengguna membuat Tugas HTTP tanpa perlu memberikan Konfigurasi Tugas (URL HTTP, header, otorisasi), sehingga Anda dapat mengirim pesan atau isi permintaan ke Buffer API dengan mudah.

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

Untuk menggunakan BufferTask API, antrean harus memiliki konfigurasi Target URI yang ditetapkan, atau dengan kata lain, fitur Konfigurasi Perutean tingkat Antrean adalah prasyarat untuk menggunakan BufferTask API.

Membuat antrean Cloud Tasks dengan konfigurasi pemilihan rute

Buat antrean dengan konfigurasi perutean yang mengarah ke layanan pertama yang kita deploy pada 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. Menyimpan permintaan HTTP dengan BufferTask API

Pada langkah ini, Anda akan melakukan buffering permintaan HTTP GET atau POST sederhana dengan BufferTask API. Di balik layar, Cloud Tasks akan membungkus permintaan HTTP ini menjadi tugas HTTP dengan setelan konfigurasi perutean default antrean.

Pertama, 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 ini adalah permintaan HTTP GET sederhana tanpa perlu membuat Tugas:

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 HTTP GET dikirim langsung ke BufferTask API tanpa harus membungkusnya 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 HTTP GET dan POST 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 antar-layanan dengan mudah.

Pembersihan (Opsional)

Agar tidak dikenai biaya, sebaiknya bersihkan resource.

Jika tidak memerlukan project, Anda dapat menghapusnya:

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 tertunda dengan penggantian URI HTTP tingkat antrean yang baru.
  • Cara mem-buffer permintaan HTTP dengan lebih mudah menggunakan BufferTask API baru.