Mulai menggunakan Cloud Functions (generasi ke-2)

1. Pengantar

Untuk mulai menulis fungsi Cloud Run, Anda dapat menggunakan codelab berikut:

Jika tidak, codelab ini akan memandu Anda membuat Cloud Functions (generasi ke-2).

Ringkasan

Cloud Functions (generasi ke-2) adalah Google Cloud Functions versi berikutnya, yang merupakan penawaran Functions as a Service dari Google Cloud. Versi baru ini dilengkapi dengan set fitur lanjutan dan kini didukung oleh Cloud Run dan Eventarc, yang memberi Anda kontrol lebih canggih atas performa dan skalabilitas, serta kontrol yang lebih besar terkait runtime fungsi dan pemicu dari lebih dari 90 sumber peristiwa.

Codelab ini akan memandu Anda membuat Cloud Functions yang merespons panggilan HTTP, dan dipicu oleh pesan Pub/Sub dan Cloud Audit Logs.

Yang Baru?

Versi baru Cloud Functions ini memberikan pengalaman FaaS yang ditingkatkan, yang didukung oleh Cloud Run, Cloud Build, Artifact Registry, dan Eventarc.

Infrastruktur yang Disempurnakan

  • Pemrosesan permintaan yang lebih lama: Menjalankan Cloud Functions lebih lama dari default 5 menit, sehingga mempermudah untuk menjalankan beban kerja permintaan yang lebih lama seperti memproses aliran data yang besar dari Cloud Storage atau BigQuery. Untuk fungsi HTTP, waktu tunggunya adalah hingga 60 menit. Untuk fungsi yang dipicu peristiwa, saat ini waktunya maksimal 10 menit.
  • Instance yang lebih besar: Manfaatkan RAM hingga 16 GB dan 4 vCPU di Cloud Functions yang memungkinkan beban kerja dalam memori, komputasi yang intensif, dan lebih paralel yang lebih besar.
  • Konkurensi: Memproses hingga 1.000 permintaan serentak dengan satu instance fungsi, sehingga meminimalkan cold start dan meningkatkan latensi saat melakukan penskalaan.
  • Instance minimum: Menyediakan instance yang telah di-warmup untuk mengurangi cold start dan memastikan waktu bootstrap aplikasi Anda tidak memengaruhi performa aplikasi.
  • Pemisahan traffic: Mendukung beberapa versi fungsi Anda, membagi traffic di antara versi yang berbeda-beda, dan melakukan roll back fungsi Anda ke versi sebelumnya.

Cakupan Peristiwa dan dukungan CloudEvents yang lebih luas

  • Integrasi Eventarc: Cloud Functions kini menyertakan dukungan native untuk Eventarc, yang menghadirkan lebih dari 90 sumber peristiwa menggunakan log Cloud Audit (BigQuery, Cloud SQL, Cloud Storage...), dan tentu saja Cloud Functions masih mendukung peristiwa dari sumber kustom dengan memublikasikan ke Cloud Pub/Sub secara langsung.
  • Format CloudEvent: Semua fungsi berbasis peristiwa mematuhi CloudEvents standar industri ( cloudevents.io), terlepas dari sumbernya, untuk memastikan pengalaman developer yang konsisten. Payload dikirim melalui CloudEvent terstruktur dengan payload cloudevent.data dan menerapkan standar CloudEvent.

Yang akan Anda pelajari

  • Ringkasan Cloud Functions (generasi ke-2).
  • Cara menulis fungsi yang merespons panggilan HTTP.
  • Cara menulis fungsi yang merespons pesan Pub/Sub.
  • Cara menulis fungsi yang merespons peristiwa Cloud Storage.
  • Cara menulis fungsi yang merespons Cloud Audit Logs.
  • Cara membagi traffic dalam dua revisi.
  • Cara menghilangkan cold start dengan instance minimum.
  • Cara menetapkan konkurensi.

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 harus 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 melihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada 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 seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. 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.

Menyiapkan gcloud

Di Cloud Shell, pastikan project ID Anda ditetapkan dan disimpan ke variabel PROJECT_ID dan REGION ditetapkan ke us-west1:

gcloud config set project [YOUR-PROJECT-ID]
PROJECT_ID=$(gcloud config get-value project)
REGION=us-west1

Mengaktifkan API

Aktifkan semua layanan yang diperlukan:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudfunctions.googleapis.com \
  cloudbuild.googleapis.com \
  eventarc.googleapis.com \
  run.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com

3. Fungsi HTTP

Untuk fungsi pertama, mari kita buat fungsi Node.js yang diautentikasi dan merespons permintaan HTTP. Mari kita gunakan juga waktu tunggu 10 menit untuk menunjukkan bagaimana fungsi dapat memiliki lebih banyak waktu untuk merespons permintaan HTTP.

Berkreasi

Buat folder untuk aplikasi dan buka folder tersebut:

mkdir ~/hello-http && cd $_

Buat file index.js yang hanya merespons permintaan HTTP:

const functions = require('@google-cloud/functions-framework');

functions.http('helloWorld', (req, res) => {
  res.status(200).send('HTTP with Node.js in GCF 2nd gen!');
});

Buat file package.json untuk menentukan dependensi:

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

Deploy

Deploy fungsi tersebut:

gcloud functions deploy nodejs-http-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --timeout 600s

Meskipun tidak mutlak diperlukan untuk langkah ini, perhatikan waktu tunggu 600 detik. Hal ini memungkinkan fungsi memiliki waktu tunggu yang lebih lama untuk merespons permintaan HTTP.

Setelah fungsi di-deploy, Anda dapat melihatnya di bagian Cloud Functions di Cloud Console:

7541800e1e3f299f.png

Menguji

Uji fungsi dengan perintah berikut:

gcloud functions call nodejs-http-function \
  --gen2 --region $REGION

Anda akan melihat pesan HTTP with Node.js in GCF 2nd gen! sebagai respons.

4. Fungsi Pub/Sub

Untuk fungsi kedua, mari kita buat fungsi Python yang dipicu oleh pesan Pub/Sub yang dipublikasikan ke topik tertentu.

Menyiapkan token autentikasi Pub/Sub

Jika Anda mengaktifkan akun layanan Pub/Sub pada atau sebelum 8 April 2021, berikan peran iam.serviceAccountTokenCreator ke akun layanan Pub/Sub:

PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member  serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

Berkreasi

Buat topik Pub/Sub yang akan digunakan untuk contoh:

TOPIC=cloud-functions-gen2-topic
gcloud pubsub topics create $TOPIC

Buat folder untuk aplikasi dan buka folder tersebut:

mkdir ~/hello-pubsub && cd $_

Buat file main.py yang hanya mencatat pesan yang berisi ID CloudEvent:

import functions_framework

@functions_framework.cloud_event
def hello_pubsub(cloud_event):
   print('Pub/Sub with Python in GCF 2nd gen! Id: ' + cloud_event['id'])

Buat file requirements.txt dengan konten berikut untuk menentukan dependensi:

functions-framework==3.*

Deploy

Deploy fungsi tersebut:

gcloud functions deploy python-pubsub-function \
  --gen2 \
  --runtime python39 \
  --entry-point hello_pubsub \
  --source . \
  --region $REGION \
  --trigger-topic $TOPIC

Setelah fungsi di-deploy, Anda dapat melihatnya di bagian Cloud Functions di Cloud Console:

107029714c32baff.pngS

Menguji

Uji fungsi dengan mengirim pesan ke topik:

gcloud pubsub topics publish $TOPIC --message="Hello World"

Anda akan melihat CloudEvent yang diterima di log:

gcloud functions logs read python-pubsub-function \
  --region $REGION --gen2 --format "value(log)"

5. Fungsi Cloud Storage

Untuk fungsi berikutnya, mari kita buat fungsi Node.js yang merespons peristiwa dari bucket Cloud Storage.

Siapkan

Untuk menggunakan fungsi Cloud Storage, berikan peran IAM pubsub.publisher ke akun layanan Cloud Storage:

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/pubsub.publisher

Berkreasi

Buat folder untuk aplikasi dan buka folder tersebut:

mkdir ~/hello-storage && cd $_

Buat file index.js yang hanya merespons peristiwa Cloud Storage:

const functions = require('@google-cloud/functions-framework');

functions.cloudEvent('helloStorage', (cloudevent) => {
  console.log('Cloud Storage event with Node.js in GCF 2nd gen!');
  console.log(cloudevent);
});

Buat file package.json untuk menentukan dependensi:

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

Deploy

Pertama, buat bucket Cloud Storage (atau gunakan bucket yang sudah ada):

​​export BUCKET="gs://gcf-gen2-storage-$PROJECT_ID"
gsutil mb -l $REGION $BUCKET

Deploy fungsi tersebut:

gcloud functions deploy nodejs-storage-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloStorage \
  --source . \
  --region $REGION \
  --trigger-bucket $BUCKET \
  --trigger-location $REGION

Setelah fungsi di-deploy, Anda dapat melihatnya di bagian Cloud Functions pada Konsol Cloud.

Menguji

Uji fungsi dengan mengupload file ke bucket:

echo "Hello World" > random.txt
gsutil cp random.txt $BUCKET/random.txt

Anda akan melihat CloudEvent yang diterima di log:

gcloud functions logs read nodejs-storage-function \
  --region $REGION --gen2 --limit=100 --format "value(log)"

6. Fungsi Cloud Audit Logs

Untuk fungsi berikutnya, mari kita buat fungsi Node.js yang menerima peristiwa Log Audit Cloud saat instance VM Compute Engine dibuat. Sebagai respons, tindakan ini akan menambahkan label ke VM yang baru dibuat, yang menentukan pembuat VM.

Menentukan VM Compute Engine yang baru dibuat

Compute Engine mengeluarkan 2 Log Audit saat VM dibuat.

Yang pertama dikeluarkan di awal pembuatan VM dan terlihat seperti ini:

8d394a481644c4b6.png

Yang kedua dikeluarkan setelah pembuatan VM dan terlihat seperti ini:

ee0e221d82887cd1.png

Perhatikan kolom operasi dengan nilai first: true dan last: true. Log Audit kedua berisi semua informasi yang diperlukan untuk memberi label pada instance. Oleh karena itu, kita akan menggunakan flag last: true untuk mendeteksinya di Cloud Functions.

Siapkan

Untuk menggunakan fungsi Cloud Audit Logs, Anda harus mengaktifkan Log Audit untuk Eventarc. Anda juga perlu menggunakan akun layanan dengan peran eventarc.eventReceiver.

  1. Aktifkan jenis log Pembacaan Admin, Pembacaan Data, dan Penulisan Data Cloud Audit Log untuk Compute Engine API:

76b7417ea4071241.png

  1. Berikan peran IAM eventarc.eventReceiver ke akun layanan Compute Engine default:
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
  --role roles/eventarc.eventReceiver

Mendapatkan kode

Clone repo yang berisi aplikasi:

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

Buka direktori aplikasi:

cd eventarc-samples/gce-vm-labeler/gcf/nodejs

File index.js berisi kode aplikasi yang menerima Log Audit yang digabungkan ke dalam CloudEvent. Kemudian, alat ini mengekstrak detail instance VM Compute Engine dan menetapkan label pada instance VM. Silakan pelajari index.js secara lebih mendetail sendiri.

Deploy

Anda dapat men-deploy fungsi dengan gcloud seperti sebelumnya. Perhatikan cara fungsi memfilter di Log Audit untuk penyisipan Compute Engine dengan flag --trigger-event-filters:

gcloud functions deploy gce-vm-labeler \
  --gen2 \
  --runtime nodejs16 \
  --entry-point labelVmCreation \
  --source . \
  --region $REGION \
  --trigger-event-filters="type=google.cloud.audit.log.v1.written,serviceName=compute.googleapis.com,methodName=beta.compute.instances.insert" \
  --trigger-location us-central1

Anda juga dapat men-deploy fungsi dan menambahkan pemicu Eventarc dari Konsol Google Cloud.

Pertama, buka bagian Cloud Functions dan buat fungsi dengan lingkungan generasi ke-2:

8ba79a12ee152d8.png

Klik tombol Add Eventarc Trigger:

655346320a5e3631.png

Tindakan ini akan membuka panel samping di sebelah kanan tempat Anda dapat memilih berbagai penyedia peristiwa dan peristiwa untuk pemicu Eventarc.

Pilih penyedia peristiwa dan peristiwa yang tepat, lalu klik Save Trigger:

7d24325ff06c9b05.png

Terakhir, di halaman berikutnya, Anda dapat memperbarui file index.js dan package.json dengan file index.js dan package.json di GitHub, lalu mengklik tombol Deploy:

f2e338eed2ccf5a2.png

Menguji

Untuk menguji fungsi Log Audit, Anda perlu membuat VM Compute Engine di Konsol Cloud (Anda juga dapat membuat VM dengan gcloud, tetapi sepertinya tidak menghasilkan Log Audit).

Buka bagian Compute Engine > VM instances di Cloud Console dan buat VM baru. Setelah pembuatan VM selesai, Anda akan melihat label creator yang ditambahkan pada VM di Cloud Console di bagian Basic information atau menggunakan perintah berikut:

gcloud compute instances describe YOUR_VM_NAME

Anda akan melihat label dalam output seperti contoh berikut:

...
labelFingerprint: ULU6pAy2C7s=
labels:
  creator: atameldev
...

7. Pemisahan traffic

Cloud Functions (generasi ke-2) mendukung beberapa revisi fungsi Anda, memisahkan traffic di antara revisi yang berbeda, dan melakukan roll back fungsi Anda ke versi sebelumnya. Hal ini dimungkinkan karena fungsi generasi ke-2 adalah layanan Cloud Run di balik layar.

Pada langkah ini, Anda akan men-deploy 2 revisi fungsi, lalu membagi traffic di antara keduanya 50-50.

Berkreasi

Buat folder untuk aplikasi dan buka folder tersebut:

mkdir ~/traffic-splitting && cd $_

Buat file main.py dengan fungsi Python yang membaca variabel lingkungan warna dan merespons kembali dengan Hello World dalam warna latar belakang tersebut:

import os

color = os.environ.get('COLOR')

def hello_world(request):
    return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'

Deploy

Deploy revisi pertama fungsi dengan latar belakang oranye:

COLOR=orange
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

Pada tahap ini, jika menguji fungsi dengan melihat pemicu HTTP (output URI dari perintah deployment di atas) di browser, Anda akan melihat Hello World dengan latar belakang oranye:

36ca0c5f39cc89cf.png

Deploy revisi kedua dengan latar belakang kuning:

COLOR=yellow
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

Karena ini adalah revisi terbaru, jika Anda menguji fungsi, Anda akan melihat Hello World dengan latar belakang kuning:

391286a08ad3cdde.png

Membagi traffic 50-50

Untuk memisahkan traffic antara revisi oranye dan kuning, Anda perlu menemukan ID revisi layanan Cloud Run yang mendasarinya. Berikut adalah perintah untuk melihat ID revisi:

gcloud run revisions list --service hello-world-colored \
  --region $REGION --format 'value(REVISION)'

Outputnya akan mirip dengan berikut ini:

hello-world-colored-00001-man
hello-world-colored-00002-wok

Sekarang, bagi traffic di antara dua revisi ini sebagai berikut (update X-XXX sesuai dengan nama revisi Anda):

gcloud run services update-traffic hello-world-colored \
  --region $REGION \
  --to-revisions hello-world-colored-0000X-XXX=50,hello-world-colored-0000X-XXX=50

Menguji

Uji fungsi dengan mengunjungi URL publiknya. Sebagian besar waktu, Anda akan melihat revisi oranye dan, sebagian lainnya, revisi kuning:

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

Lihat rollback, peluncuran bertahap, dan migrasi traffic untuk mengetahui informasi selengkapnya.

8. Instance minimum

Di Cloud Functions (generasi ke-2), Anda dapat menentukan jumlah minimum instance fungsi yang harus tetap aktif dan siap melayani permintaan. Hal ini berguna untuk membatasi jumlah cold start.

Pada langkah ini, Anda akan men-deploy fungsi dengan inisialisasi lambat. Anda akan mengamati masalah cold start. Kemudian, Anda akan men-deploy fungsi dengan nilai instance minimum yang ditetapkan ke 1 untuk menghilangkan cold start.

Berkreasi

Buat folder untuk aplikasi dan buka folder tersebut:

mkdir ~/min-instances && cd $_

Buat file main.go. Layanan Go ini memiliki fungsi init yang tidur selama 10 detik untuk menyimulasikan inisialisasi yang lama. Fungsi ini juga memiliki fungsi HelloWorld yang merespons panggilan HTTP:

package p

import (
        "fmt"
        "net/http"
        "time"
)

func init() {
        time.Sleep(10 * time.Second)
}

func HelloWorld(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Slow HTTP Go in GCF 2nd gen!")
}

Deploy

Deploy revisi pertama fungsi dengan nilai instance minimum default nol:

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated

Uji fungsi dengan perintah ini:

gcloud functions call slow-function \
  --gen2 --region $REGION

Anda akan mengamati penundaan 10 detik (cold start) pada panggilan pertama, lalu melihat pesan. Panggilan berikutnya akan segera ditampilkan.

Menetapkan instance minimum

Untuk menghilangkan cold start pada permintaan pertama, deploy ulang fungsi dengan tanda --min-instances ditetapkan ke 1 sebagai berikut:

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

Menguji

Uji kembali fungsi:

gcloud functions call slow-function \
  --gen2 --region $REGION

Anda tidak akan melihat jeda 10 detik lagi di permintaan pertama. Masalah cold start untuk pemanggilan pertama (setelah lama tidak ada) telah hilang, berkat instance minimum.

Lihat menggunakan instance minimum untuk mengetahui informasi selengkapnya.

9. Serentak

Di Cloud Functions (generasi ke-2), instance fungsi menangani 1 permintaan serentak secara default, tetapi Anda dapat menentukan jumlah permintaan serentak yang dapat diproses secara bersamaan oleh instance. Hal ini juga dapat berguna untuk mencegah cold start karena instance fungsi baru tidak perlu dibuat untuk setiap permintaan paralel.

Pada langkah ini, Anda akan menggunakan fungsi dengan inisialisasi lambat dari langkah sebelumnya. Anda akan mengirim 10 permintaan dan mengamati masalah cold start lagi karena instance fungsi baru perlu dibuat untuk menangani permintaan.

Untuk memperbaiki masalah cold start, Anda akan men-deploy fungsi lain dengan nilai serentak 100. Anda akan mengamati bahwa 10 permintaan sekarang tidak menyebabkan masalah cold start dan satu instance fungsi dapat menangani semua permintaan.

Menguji tanpa konkurensi

Dapatkan URL fungsi:

SLOW_URL=$(gcloud functions describe slow-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

Gunakan alat tolok ukur open source yang disebut hey untuk mengirim 10 permintaan serentak ke fungsi lambat. hey sudah terinstal di Cloud Shell:

hey -n 10 -c 10 $SLOW_URL

Anda akan melihat dalam output hey bahwa beberapa permintaan memerlukan waktu lama:

Summary:
  Total:        10.9053 secs
  Slowest:      10.9048 secs
  Fastest:      0.4439 secs
  Average:      9.7930 secs
  Requests/sec: 0.9170

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.444 [1]     |■■■■
  1.490 [0]     |
  2.536 [0]     |
  3.582 [0]     |
  4.628 [0]     |
  5.674 [0]     |
  6.720 [0]     |
  7.767 [0]     |
  8.813 [0]     |
  9.859 [0]     |
  10.905 [9]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Hal ini karena lebih banyak instance fungsi yang dibuat untuk menangani permintaan. Jika Anda memeriksa jumlah instance aktif untuk fungsi, Anda juga akan melihat bahwa lebih dari satu instance dibuat dalam kondisi tertentu dan hal ini menyebabkan masalah cold start:

9f5c6877836d62fb.png

Deploy

Deploy fungsi baru yang identik dengan fungsi sebelumnya. Setelah di-deploy, Anda akan meningkatkan konkurensi:

gcloud functions deploy slow-concurrent-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

Menetapkan konkurensi

Tetapkan konkurensi layanan Cloud Run yang mendasarinya untuk fungsi menjadi 100 (maksimum 1.000). Hal ini memastikan bahwa setidaknya 100 permintaan dapat ditangani oleh satu instance fungsi:

gcloud run services update slow-concurrent-function \
  --concurrency 100 \
  --cpu 1 \
  --region $REGION 

Menguji dengan konkurensi

Dapatkan URL fungsi:

SLOW_CONCURRENT_URL=$(gcloud functions describe slow-concurrent-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

Kemudian, gunakan hey untuk mengirim 10 permintaan serentak:

hey -n 10 -c 10 $SLOW_CONCURRENT_URL

Anda akan melihat dalam output hey bahwa semua permintaan diproses dengan cepat:

Summary:
  Total:        0.2164 secs
  Slowest:      0.2163 secs
  Fastest:      0.0921 secs
  Average:      0.2033 secs
  Requests/sec: 46.2028

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.092 [1]     |■■■■
  0.105 [0]     |
  0.117 [0]     |
  0.129 [0]     |
  0.142 [0]     |
  0.154 [0]     |
  0.167 [0]     |
  0.179 [0]     |
  0.191 [0]     |
  0.204 [0]     |
  0.216 [9]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Satu instance fungsi dapat menangani semua permintaan dan masalah cold start hilang, berkat peningkatan konkurensi.

Lihat serentak untuk informasi selengkapnya.

10. Selamat!

Selamat, Anda telah menyelesaikan codelab.

Yang telah kita bahas

  • Ringkasan Cloud Functions (generasi ke-2).
  • Cara menulis fungsi yang merespons panggilan HTTP.
  • Cara menulis fungsi yang merespons pesan Pub/Sub.
  • Cara menulis fungsi yang merespons peristiwa Cloud Storage.
  • Cara menulis fungsi yang merespons Cloud Audit Logs.
  • Cara membagi traffic dalam dua revisi.
  • Cara menghilangkan cold start dengan instance minimum.
  • Cara menetapkan konkurensi.