Créer un pool de workers Cloud Run pour les abonnements Pub/Sub basés sur l'extraction

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.