1. Introducción
Descripción general
Los grupos de trabajadores son un recurso de Cloud Run diseñado específicamente para cargas de trabajo que no son de solicitudes, como las colas de extracción. Ten en cuenta que los grupos de trabajadores no tienen las siguientes funciones:
- Sin extremo ni URL
- No se requiere que el contenedor implementado escuche solicitudes en un puerto.
- Sin ajuste de escala automático
En este codelab, crearás un grupo de trabajadores que recuperará mensajes de forma continua desde una suscripción de extracción de Pub/Sub. Puedes obtener más información sobre las suscripciones de extracción de Pub/Sub en la documentación y en este ejemplo de código.
Qué aprenderás
- Cómo crear e implementar en un grupo de trabajadores de Cloud Run
- Cómo recuperar mensajes de una suscripción a Pub/Sub basada en extracción
2. Configuración y requisitos
Primero, configura las variables de entorno para este 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
A continuación, configura gcloud para que use tu ID del proyecto.
gcloud config set project $PROJECT_ID
Antes de comenzar a usar este codelab, habilita las siguientes APIs ejecutando el siguiente comando:
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
pubsub.googleapis.com
Para crear la cuenta de servicio, ejecuta el siguiente comando:
gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
--display-name="Service account for worker pool codelab"
Por último, otorga a tu cuenta de servicio de Cloud Run acceso a Pub/Sub:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
--role='roles/pubsub.admin'
3. Crea el grupo de trabajadores de Cloud Run
Primero, crea un directorio para el código de tu grupo de trabajadores:
mkdir codelab-worker-pools
cd codelab-worker-pools
A continuación, crea un archivo llamado 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"
}
}
Ahora, crea un archivo llamado 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. Implementa el grupo de trabajadores
Ejecuta el siguiente comando para crear el grupo de trabajadores de Cloud Run:
gcloud beta run worker-pools deploy $WORKER_POOL_NAME --region=$REGION --source .
Este comando compila la imagen desde la fuente e implementa el trabajo. Tardará unos minutos en completarse.
5. Publica un mensaje en Pub/Sub
Crea un tema de Pub/Sub
gcloud pubsub topics create $TOPIC
Crea una suscripción de extracción de Pub/Sub
gcloud pubsub subscriptions create codelab-subscription --topic=$TOPIC
Ejecuta el siguiente comando para publicar un mensaje en tu tema de Pub/Sub.
gcloud pubsub topics publish $TOPIC --message "Hello Worker Pools"
Verifica los registros de tu grupo de trabajadores
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
Deberías ver Hello Worker Pools
en los registros.
6. Borra el grupo de trabajadores
Dado que los grupos de trabajadores se ejecutan de forma continua, debes borrarlos.
gcloud beta run worker-pools delete $WORKER_POOL_NAME --region $REGION
7. ¡Felicitaciones!
¡Felicitaciones por completar el codelab!
Te recomendamos que revises la documentación de Cloud Run.
Temas abordados
- Cómo crear e implementar en un grupo de trabajadores de Cloud Run
- Cómo recuperar mensajes de una suscripción a Pub/Sub basada en extracción
8. Limpia
Para borrar el grupo de trabajadores de Cloud Run, ve a la consola de Cloud Run en https://console.cloud.google.com/run y borra el grupo de trabajadores codelab-workers-pubsub
.
Para borrar todo el proyecto, ve a Administrar recursos, selecciona el proyecto que creaste en el paso 2 y elige Borrar. Si borras el proyecto, deberás cambiar de proyecto en el SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list
.