Introduzione a Cloud Functions (2a gen.)

1. Introduzione

Per iniziare a scrivere funzioni Cloud Run, puoi utilizzare i seguenti codelab:

In caso contrario, questo codelab illustra la procedura per creare Cloud Functions (2ª gen.).

Panoramica

Cloud Functions (2ª gen.) è la versione successiva di Google Cloud Functions, l'offerta Functions as a Service di Google Cloud. Questa nuova versione è dotata di un set di funzionalità avanzate ed è ora basata su Cloud Run ed Eventarc, per offrirti un controllo più avanzato su prestazioni e scalabilità, nonché sul runtime delle funzioni e sugli trigger da oltre 90 origini evento.

Questo codelab illustra la procedura per creare funzioni Cloud che rispondono alle chiamate HTTP e vengono attivate dai messaggi Pub/Sub e dai log di controllo di Cloud.

Novità

Questa nuova versione di Cloud Functions offre un'esperienza FaaS migliorata basata su Cloud Run, Cloud Build, Artifact Registry ed Eventarc.

Infrastruttura migliorata

  • Elaborazione delle richieste più lunga: esegui le funzioni Cloud per un periodo di tempo superiore al valore predefinito di 5 minuti, in modo da eseguire più facilmente carichi di lavoro delle richieste più lunghi, come l'elaborazione di grandi stream di dati da Cloud Storage o BigQuery. Per le funzioni HTTP, il tempo massimo è 60 minuti. Per le funzioni basate su eventi, al momento il valore massimo è 10 minuti.
  • Istanze più grandi:sfrutta fino a 16 GB di RAM e 4 vCPU su Cloud Functions per consentire carichi di lavoro in-memory più grandi, ad alta intensità di calcolo e più paralleli.
  • Contemporaneità: elabora fino a 1000 richieste in parallelo con una singola istanza di funzione, riducendo al minimo gli avvii a freddo e migliorando la latenza durante la scalabilità.
  • Istanze minime: fornisci istanze preriscaldate per ridurre gli avvii a freddo e assicurarti che il tempo di bootstrap dell'applicazione non influisca sul rendimento dell'applicazione.
  • Suddivisione del traffico:supporta più versioni delle funzioni, suddividi il traffico tra versioni diverse ed esegui il rollback della funzione a una versione precedente.

Copertura più ampia degli eventi e supporto di CloudEvents

  • Integrazione Eventarc: Cloud Functions ora include il supporto nativo per Eventarc, che include oltre 90 origini di eventi tramite gli audit log di Cloud (BigQuery, Cloud SQL, Cloud Storage...) e, ovviamente, Cloud Functions supporta ancora gli eventi provenienti da origini personalizzate pubblicando direttamente in Cloud Pub/Sub.
  • Formato CloudEvent: tutte le funzioni basate su eventi rispettano lo standard di settore CloudEvents ( cloudevents.io), indipendentemente dalla sorgente, per garantire un'esperienza omogenea per gli sviluppatori. I payload vengono inviati tramite un CloudEvent strutturato con un payload cloudevent.data e implementano lo standard CloudEvent.

Obiettivi didattici

  • Panoramica di Cloud Functions (2a gen.).
  • Come scrivere una funzione che risponda alle chiamate HTTP.
  • Come scrivere una funzione che risponda ai messaggi Pub/Sub.
  • Come scrivere una funzione che risponda agli eventi Cloud Storage.
  • Come scrivere una funzione che risponda a Cloud Audit Logs.
  • Come suddividere il traffico tra due revisioni.
  • Come eliminare gli avvii a freddo con il numero minimo di istanze.
  • Come impostare la contemporaneità.

2. Configurazione e requisiti

Configurazione dell'ambiente da seguire in modo autonomo

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarlo in qualsiasi momento.
  • L'ID progetto deve essere univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca. In genere non è importante sapere quale sia. Nella maggior parte dei codelab, è necessario fare riferimento all'ID progetto (in genere è identificato come PROJECT_ID). Se l'ID generato non ti piace, puoi generarne un altro casuale. In alternativa, puoi provare il tuo e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà invariato per tutta la durata del progetto.
  • Per tua informazione, esiste un terzo valore, un Numero progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare le API/risorse Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non del tutto. Per arrestare le risorse in modo da non dover pagare dopo questo tutorial, puoi eliminare le risorse che hai creato o l'intero progetto. I nuovi utenti di Google Cloud possono partecipare al programma Prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere utilizzato da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Dalla console Google Cloud, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:

55efc1aaa7a4d3ad.png

Dovrebbe richiedere solo pochi istanti per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere qualcosa di simile a questo:

7ffe5cbb04455448.png

Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione di rete. Tutto il lavoro in questo codelab può essere svolto all'interno di un browser. Non devi installare nulla.

Configura gcloud

In Cloud Shell, assicurati che l'ID progetto sia impostato e salvato in una variabile PROJECT_ID e che REGION sia impostato su us-west1:

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

Abilita API

Attiva tutti i servizi necessari:

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. Funzione HTTP

Per la prima funzione, creiamo una funzione Node.js autenticata che risponda alle richieste HTTP. Utilizziamo anche un timeout di 10 minuti per mostrare come una funzione può avere più tempo per rispondere alle richieste HTTP.

Crea

Crea una cartella per l'app e vai a questa cartella:

mkdir ~/hello-http && cd $_

Crea un file index.js che risponda semplicemente alle richieste 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!');
});

Crea un file package.json per specificare le dipendenze:

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

Esegui il deployment

Esegui il deployment della funzione:

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

Sebbene non sia strettamente necessario per questo passaggio, tieni presente il timeout di 600 secondi. In questo modo, la funzione può avere un timeout più lungo per rispondere alle richieste HTTP.

Una volta eseguito il deployment della funzione, puoi vederla nella sezione Cloud Functions della console Cloud:

7541800e1e3f299f.png

Test

Testa la funzione con il seguente comando:

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

Dovresti visualizzare il messaggio HTTP with Node.js in GCF 2nd gen! come risposta.

4. Funzione Pub/Sub

Per la seconda funzione, creiamo una funzione Python attivata da un messaggio Pub/Sub pubblicato in un argomento specifico.

Configura i token di autenticazione Pub/Sub

Se hai attivato l'account di servizio Pub/Sub il giorno 8 aprile 2021 o in una data precedente, concedi il ruolo iam.serviceAccountTokenCreator all'account di servizio 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

Crea

Crea un argomento Pub/Sub da utilizzare per il sample:

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

Crea una cartella per l'app e vai a questa cartella:

mkdir ~/hello-pubsub && cd $_

Crea un file main.py che registri semplicemente un messaggio contenente l'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'])

Crea un file requirements.txt con i seguenti contenuti per specificare le dipendenze:

functions-framework==3.*

Esegui il deployment

Esegui il deployment della funzione:

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

Una volta eseguita la distribuzione della funzione, puoi visualizzarla nella sezione Cloud Functions della console Cloud:

107029714c32baff.png

Test

Testa la funzione inviando un messaggio all'argomento:

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

Nei log dovresti vedere l'evento CloudEvent ricevuto:

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

5. Funzione Cloud Storage

Per la prossima funzione, creiamo una funzione Node.js che risponda agli eventi di un bucket Cloud Storage.

Configura

Per utilizzare le funzioni Cloud Storage, concedi il ruolo IAM pubsub.publisher all'account di servizio 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

Crea

Crea una cartella per l'app e vai a questa cartella:

mkdir ~/hello-storage && cd $_

Crea un file index.js che risponda semplicemente agli eventi di 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);
});

Crea un file package.json per specificare le dipendenze:

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

Esegui il deployment

Innanzitutto, crea un bucket Cloud Storage (o utilizzane uno esistente):

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

Esegui il deployment della funzione:

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

Una volta eseguita il deployment della funzione, puoi visualizzarla nella sezione Cloud Functions della console Cloud.

Test

Testa la funzione caricando un file nel bucket:

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

Nei log dovresti vedere l'evento CloudEvent ricevuto:

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

6. Funzione Audit log di Cloud

Per la funzione successiva, creiamo una funzione Node.js che riceve un evento Log di controllo cloud quando viene creata un'istanza VM Compute Engine. In risposta, aggiunge un'etichetta alla VM appena creata, specificando il creator della VM.

Determinare le VM Compute Engine appena create

Compute Engine emette due log di controllo quando viene creata una VM.

Il primo viene emesso all'inizio della creazione della VM e ha il seguente aspetto:

8d394a481644c4b6.png

Il secondo viene emesso dopo la creazione della VM e ha il seguente aspetto:

ee0e221d82887cd1.png

Tieni presente il campo dell'operazione con i valori first: true e last: true. Il secondo audit log contiene tutte le informazioni necessarie per etichettare un'istanza, pertanto utilizzeremo il flag last: true per rilevarlo in Cloud Functions.

Configura

Per utilizzare le funzioni degli audit log di Cloud, devi attivare gli audit log per Eventarc. Devi anche utilizzare un account di servizio con il ruolo eventarc.eventReceiver.

  1. Attiva i tipi di log di controllo di Cloud Lettura amministrazione, Lettura dati e Scrittura dati per l'API Compute Engine:

76b7417ea4071241.png

  1. Concedi all'account di servizio Compute Engine predefinito il ruolo IAM eventarc.eventReceiver:
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
  --role roles/eventarc.eventReceiver

Ottieni il codice

Clona il repository che contiene l'applicazione:

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

Vai alla directory dell'app:

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

Il file index.js contiene il codice dell'applicazione che riceve il log di controllo inserito in un CloudEvent. Estrae quindi i dettagli dell'istanza VM Compute Engine e imposta un'etichetta sull'istanza VM. Non esitare a studiare index.js in modo più dettagliato.

Esegui il deployment

Puoi eseguire il deployment della funzione con gcloud come prima. Tieni presente che la funzione filtra i log di controllo per le inserzioni di Compute Engine con il 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

Puoi anche eseguire il deployment della funzione e aggiungere un trigger Eventarc dalla console Google Cloud.

Innanzitutto, vai alla sezione Cloud Functions e crea una funzione con un ambiente di 2ª generazione:

8ba79a12ee152d8.png

Fai clic sul pulsante Add Eventarc Trigger:

655346320a5e3631.png

Viene visualizzato un riquadro laterale a destra in cui puoi scegliere diversi fornitori di eventi ed eventi per l'attivatore Eventarc.

Scegli il fornitore e l'evento giusti, quindi fai clic su Save Trigger:

7d24325ff06c9b05.png

Infine, nella pagina successiva, puoi aggiornare i file index.js e package.json con i file index.js e package.json su GitHub e fare clic sul pulsante Deploy:

f2e338eed2ccf5a2.png

Test

Per testare la funzione di log di controllo, devi creare una VM Compute Engine nella console Cloud (puoi anche creare VM con gcloud, ma non sembra che generi log di controllo).

Vai alla sezione Compute Engine > Istanze VM della console Cloud e crea una nuova VM. Al termine della creazione della VM, dovresti vedere l'etichetta creator aggiunta alla VM nella sezione Informazioni di base della console Cloud o utilizzando il seguente comando:

gcloud compute instances describe YOUR_VM_NAME

L'etichetta nell'output dovrebbe essere simile all'esempio seguente:

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

7. Suddivisione del traffico

Cloud Functions (2ª gen.) supporta più revisioni delle funzioni, suddividendo il traffico tra revisioni diverse ed eseguendo il rollback della funzione a una versione precedente. Questo è possibile perché le funzioni di 2ª gen. sono servizi Cloud Run sottostanti.

In questo passaggio, eseguirai il deployment di due revisioni di una funzione e poi suddividerai il traffico tra le due in modo uniforme.

Crea

Crea una cartella per l'app e vai a questa cartella:

mkdir ~/traffic-splitting && cd $_

Crea un file main.py con una funzione Python che legga una variabile di ambiente di colore e risponda con Hello World in quel colore di sfondo:

import os

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

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

Esegui il deployment

Esegui il deployment della prima revisione della funzione con uno sfondo arancione:

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

A questo punto, se testi la funzione visualizzando l'attivatore HTTP (l'output URI del comando di deployment riportato sopra) nel browser, dovresti vedere Hello World con uno sfondo arancione:

36ca0c5f39cc89cf.png

Esegui il deployment della seconda revisione con uno sfondo giallo:

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

Poiché si tratta dell'ultima revisione, se testi la funzione dovresti vedere Hello World con uno sfondo giallo:

391286a08ad3cdde.png

Suddividere il traffico 50-50

Per suddividere il traffico tra le revisioni arancione e gialla, devi trovare gli ID revisione dei servizi Cloud Run sottostanti. Questo è il comando per visualizzare gli ID revisione:

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

L'output dovrebbe essere simile al seguente:

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

Ora, suddividi il traffico tra queste due revisioni come segue (aggiorna X-XXX in base ai nomi delle revisioni):

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

Test

Testa la funzione visitando il relativo URL pubblico. La metà delle volte dovresti vedere la revisione arancione e l'altra metà la revisione gialla:

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

Per ulteriori informazioni, consulta Rollback, implementazioni graduali e migrazione del traffico.

8. Numero minimo di istanze

In Cloud Functions (2ª gen.), è possibile specificare un numero minimo di istanze di funzione da mantenere disponibili e pronte per gestire le richieste. Questo è utile per limitare il numero di avvii a freddo.

In questo passaggio, eseguirai il deployment di una funzione con un'inizializzazione lenta. Noterai il problema di avvio a freddo. Poi, esegui il deployment della funzione con il valore dell'istanza minima impostato su 1 per eliminare l'avvio a freddo.

Crea

Crea una cartella per l'app e vai a questa cartella:

mkdir ~/min-instances && cd $_

Crea un file main.go. Questo servizio Go ha una funzione init che dorme per 10 secondi per simulare un'inizializzazione di lunga durata. Dispone inoltre di una funzione HelloWorld che risponde alle chiamate 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!")
}

Esegui il deployment

Esegui il deployment della prima revisione della funzione con il valore predefinito dell'istanza minima pari a zero:

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

Testa la funzione con questo comando:

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

Noterai un ritardo di 10 secondi (avvio a freddo) alla prima chiamata, dopodiché vedrai il messaggio. Le chiamate successive dovrebbero essere restituite immediatamente.

Impostare il numero minimo di istanze

Per eliminare l'avvio a freddo alla prima richiesta, esegui nuovamente il deployment della funzione con il flag --min-instances impostato su 1 come segue:

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

Test

Testa di nuovo la funzione:

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

Non dovresti più vedere il ritardo di 10 secondi nella prima richiesta. Il problema dell'avvio a freddo per la prima chiamata (dopo molto tempo senza) non si verifica più, grazie al numero minimo di istanze.

Per ulteriori informazioni, consulta la sezione Utilizzare istanze minime.

9. Contemporaneità

In Cloud Functions (2a gen), un'istanza di funzione gestisce 1 richiesta in parallelo per impostazione predefinita, ma è possibile specificare il numero di richieste in parallelo che possono essere elaborate contemporaneamente da un'istanza. Questo può essere utile anche per evitare gli avvii a freddo, dato che non è necessario creare una nuova istanza di funzione per ogni richiesta parallela.

In questo passaggio, utilizzerai la funzione con l'inizializzazione lenta del passaggio precedente. Invierà 10 richieste e osserverà di nuovo il problema di avvio a freddo, poiché è necessario creare nuove istanze di funzione per gestire le richieste.

Per risolvere il problema di avvio a freddo, esegui il deployment di un'altra funzione con un valore di concorrenza pari a 100. Noterai che le 10 richieste ora non causano il problema di avvio a freddo e una singola istanza di funzione può gestire tutte le richieste.

Test senza concorrenza

Recupera l'URL della funzione:

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

Utilizza uno strumento di benchmarking open source chiamato hey per inviare 10 richieste simultanee alla funzione lenta. hey è già installato in Cloud Shell:

hey -n 10 -c 10 $SLOW_URL

Nell'output di hey dovresti vedere che alcune richieste richiedono molto tempo:

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]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Questo perché vengono create più istanze di funzione per gestire le richieste. Se controlli il numero di istanze attive per la funzione, dovresti anche vedere che è stata creata più di un'istanza come punto di accesso e che causano il problema dell'avvio a freddo:

9f5c6877836d62fb.png

Eseguire il deployment

Esegui il deployment di una nuova funzione identica a quella precedente. Una volta eseguito il deployment, ne aumenterà la contemporaneità:

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

Impostare la contemporaneità

Imposta la concorrenza del servizio Cloud Run sottostante per la funzione su 100 (può essere massimo 1000). Ciò garantisce che almeno 100 richieste possano essere gestite da una singola istanza di funzione:

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

Eseguire test con la concorrenza

Recupera l'URL della funzione:

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

Quindi, utilizza hey per inviare 10 richieste in parallelo:

hey -n 10 -c 10 $SLOW_CONCURRENT_URL

Nell'output di hey dovresti vedere che tutte le richieste vengono elaborate rapidamente:

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]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

Una singola istanza di funzione è stata in grado di gestire tutte le richieste e il problema dell'avvio a freddo è scomparso, grazie all'aumento della concorrenza.

Per ulteriori informazioni, consulta la sezione Contemporaneità.

10. Complimenti!

Complimenti per aver completato il codelab.

Argomenti trattati

  • Panoramica di Cloud Functions (2a gen.).
  • Come scrivere una funzione che risponda alle chiamate HTTP.
  • Come scrivere una funzione che risponda ai messaggi Pub/Sub.
  • Come scrivere una funzione che risponda agli eventi Cloud Storage.
  • Come scrivere una funzione che risponda a Cloud Audit Logs.
  • Come suddividere il traffico tra due revisioni.
  • Come eliminare gli avvii a freddo con il numero minimo di istanze.
  • Come impostare la contemporaneità.