1. Introduction
Présentation
Les pools de nœuds de calcul sont une ressource Cloud Run spécialement conçue pour les charges de travail sans requête, telles que les files d'attente d'extraction. Notez que les pools de nœuds de calcul ne disposent pas des fonctionnalités suivantes :
- Aucun point de terminaison ni URL
- Le conteneur déployé n'est pas tenu d'écouter les requêtes sur un port.
- Pas de scaling automatique
Dans cet atelier de programmation, vous allez créer un pool de nœuds de calcul qui récupérera en continu les messages d'un abonnement Pub/Sub. Pour en savoir plus sur les abonnements pull Pub/Sub, consultez la documentation et cet exemple de code.
Points abordés
- Créer et déployer sur un pool de nœuds de calcul Cloud Run
- Récupérer des messages à partir d'un abonnement Pub/Sub basé sur l'extraction
2. Préparation
Commencez par définir les variables d'environnement pour cet atelier de programmation :
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
Ensuite, configurez gcloud pour qu'il utilise votre ID de projet.
gcloud config set project $PROJECT_ID
Avant de commencer à utiliser cet atelier de programmation, activez les API suivantes en exécutant la commande suivante :
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
pubsub.googleapis.com
Créez le compte de service en exécutant la commande suivante :
gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
--display-name="Service account for worker pool codelab"
Enfin, accordez à votre compte de service Cloud Run l'accès à Pub/Sub :
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
--role='roles/pubsub.admin'
3. Créer le pool de nœuds de calcul Cloud Run
Tout d'abord, créez un répertoire pour le code de votre pool de nœuds de calcul :
mkdir codelab-worker-pools
cd codelab-worker-pools
Créez ensuite un fichier nommé 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"
}
}
Créez ensuite un fichier appelé 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. Déployer le pool de nœuds de calcul
Créez le pool de nœuds de calcul Cloud Run en exécutant la commande suivante :
gcloud beta run worker-pools deploy $WORKER_POOL_NAME --region=$REGION --source .
Cette commande crée l'image à partir de la source et déploie le job. Cette opération prend quelques minutes.
5. Publier un message dans Pub/Sub
Créer un sujet Pub/Sub
gcloud pubsub topics create $TOPIC
Créer un abonnement pull Pub/Sub
gcloud pubsub subscriptions create codelab-subscription --topic=$TOPIC
Exécutez la commande suivante pour publier un message dans votre sujet Pub/Sub.
gcloud pubsub topics publish $TOPIC --message "Hello Worker Pools"
Consulter les journaux de votre pool de nœuds de calcul
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
Vous devriez voir Hello Worker Pools
dans les journaux.
6. Supprimer le pool de nœuds de calcul
Étant donné que les pools de nœuds de calcul s'exécutent en continu, vous devez les supprimer.
gcloud beta run worker-pools delete $WORKER_POOL_NAME --region $REGION
7. Félicitations !
Bravo ! Vous avez terminé cet atelier de programmation.
Nous vous recommandons de consulter la documentation Cloud Run.
Points abordés
- Créer et déployer sur un pool de nœuds de calcul Cloud Run
- Récupérer des messages à partir d'un abonnement Pub/Sub basé sur l'extraction
8. Effectuer un nettoyage
Pour supprimer le pool de nœuds de calcul Cloud Run, accédez à la console Cloud Run à l'adresse https://console.cloud.google.com/run, puis supprimez le pool de nœuds de calcul codelab-workers-pubsub
.
Pour supprimer l'intégralité du projet, accédez à Gérer les ressources, sélectionnez le projet que vous avez créé à l'étape 2, puis choisissez "Supprimer". Si vous supprimez le projet, vous devrez changer de projet dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list
.