1. Introduzione
Panoramica
I pool di worker sono una risorsa Cloud Run progettata specificamente per i workload non basati su richieste, come le code pull. Tieni presente che i pool di worker non dispongono delle seguenti funzionalità:
- Nessun endpoint/URL
- Nessun requisito per il container di ascoltare le richieste su una porta
- Nessuna scalabilità automatica
In questo codelab creerai un worker pool che recupererà continuamente i messaggi da un abbonamento pull Pub/Sub. Puoi scoprire di più sulle sottoscrizioni pull Pub/Sub nella documentazione e in questo esempio di codice.
Obiettivi didattici
- Come creare ed eseguire il deployment in un pool di worker Cloud Run
- Come recuperare i messaggi da una sottoscrizione Pub/Sub basata sul pull
2. Configurazione e requisiti
Innanzitutto, imposta le variabili di ambiente per questo codelab:
export PROJECT_ID=<your_project_id>
export REGION=<your_region>
export WORKER_POOL_NAME=codelab-workers-pubsub
export SERVICE_ACCOUNT=worker-pools-sa
export SERVICE_ACCOUNT_EMAIL=${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com
export TOPIC=pull-pubsub-topic
Successivamente, configura gcloud in modo da utilizzare l'ID progetto.
gcloud config set project $PROJECT_ID
Prima di iniziare a utilizzare questo codelab, abilita le seguenti API eseguendo:
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
pubsub.googleapis.com
Crea il service account eseguendo:
gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
--display-name="Service account for worker pool codelab"
Infine, concedi al service account Cloud Run l'accesso a Pub/Sub:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
--role='roles/pubsub.admin'
3. Crea il pool di worker Cloud Run
Per prima cosa, crea una directory per il codice del pool di worker:
mkdir codelab-worker-pools
cd codelab-worker-pools
Dopodiché, crea un file denominato package.json
{
"name": "codelab-worker-pools",
"version": "1.0.0",
"description": "A codelab example of a Cloud Run worker pool retrieving messages from a Pull-based PubSub subscription",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"engines": {
"node": ">=22.0.0"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@google-cloud/pubsub": "^5.1.0"
}
}
Ora crea un file denominato index.js
:
'use strict';
const subscriptionNameOrId = 'pull-pubsub-topic';
const { PubSub } = require('@google-cloud/pubsub');
// Creates a Pub/Sub client; cache this for further use.
const pubSubClient = new PubSub();
// References an existing subscription.
const subscription = pubSubClient.subscription(subscriptionNameOrId);
// This function is called when a shutdown signal is received.
const handleShutdown = async (signal) => {
console.log(`\n${signal} signal caught. Shutting down gracefully...`);
try {
// 1. Stop listening for new messages. The `close()` method returns a Promise.
console.log('Closing Pub/Sub subscription...');
await subscription.close();
console.log('Pub/Sub subscription closed.');
// 2. Add any other cleanup logic here, like closing database connections.
} catch (err) {
console.error('Error during graceful shutdown:', err);
} finally {
console.log('Worker Pool exited.');
process.exit(0);
}
};
// Listen for termination signals.
// SIGINT handles Ctrl+C locally.
// SIGTERM handles signals from services like Cloud Run.
process.on('SIGINT', () => handleShutdown('SIGINT'));
process.on('SIGTERM', () => handleShutdown('SIGTERM'));
// ------------------ Pub/Sub Message Handling ------------------
// Create an event handler to process incoming messages.
const messageHandler = message => {
console.log(`Received message ${message.id}:`);
console.log(`\tData: ${message.data}`);
console.log(`\tAttributes: ${JSON.stringify(message.attributes)}`);
// Ack the message so it is not sent again.
message.ack();
};
// Register the message handler and listen for messages.
subscription.on('message', messageHandler);
console.log(
`Worker started. Listening for messages on "${subscriptionNameOrId}".`
);
console.log('If running locally, press Ctrl+C to quit.');
// The application will now listen for messages indefinitely until a shutdown
// signal is received.
4. Esegui il deployment del worker pool
Crea il pool di worker di Cloud Run eseguendo questo comando:
gcloud beta run worker-pools deploy $WORKER_POOL_NAME --region=$REGION --source .
Questo comando crea l'immagine dalla sorgente e ne esegue il deployment. Il completamento dell'operazione richiede alcuni minuti.
5. Pubblica un messaggio in Pub/Sub
Crea un argomento Pub/Sub
gcloud pubsub topics create $TOPIC
Creare una sottoscrizione pull Pub/Sub
gcloud pubsub subscriptions create codelab-subscription --topic=$TOPIC
Esegui questo comando per pubblicare un messaggio nell'argomento Pub/Sub.
gcloud pubsub topics publish $TOPIC --message "Hello Worker Pools"
Controlla i log del worker pool
gcloud logging read 'resource.type="cloud_run_worker_pool" AND resource.labels.worker_pool_name="'$WORKER_POOL_NAME'" AND resource.labels.location="'$REGION'"' --limit 10
Nei log dovresti vedere Hello Worker Pools
.
6. Elimina il worker pool
Poiché i worker pool vengono eseguiti continuamente, devi eliminarli.
gcloud beta run worker-pools delete $WORKER_POOL_NAME --region $REGION
7. Complimenti!
Congratulazioni per aver completato il codelab.
Ti consigliamo di consultare la documentazione di Cloud Run.
Argomenti trattati
- Come creare ed eseguire il deployment in un pool di worker Cloud Run
- Come recuperare i messaggi da una sottoscrizione Pub/Sub basata sul pull
8. Esegui la pulizia
Per eliminare il pool di worker Cloud Run, vai alla console Cloud Run all'indirizzo https://console.cloud.google.com/run ed elimina il pool di worker codelab-workers-pubsub
.
Per eliminare l'intero progetto, vai a Gestisci risorse, seleziona il progetto che hai creato nel passaggio 2 e scegli Elimina. Se elimini il progetto, dovrai cambiarlo in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list
.