1. Einführung
Übersicht
Worker-Pools sind eine Cloud Run-Ressource, die speziell für Arbeitslasten ohne Anfragen wie Pull-Warteschlangen entwickelt wurde. Worker-Pools haben die folgenden Funktionen nicht:
- Kein Endpunkt/keine URL
- Der bereitgestellte Container muss nicht auf Anfragen an einem Port warten.
- Kein Autoscaling
In diesem Codelab erstellen Sie einen Worker-Pool, der kontinuierlich Nachrichten aus einem Pub/Sub-Pull-Abo abruft. Weitere Informationen zu Pub/Sub-Pull-Abos finden Sie in der Dokumentation und in diesem Codebeispiel.
Lerninhalte
- Anwendungen erstellen und in einem Cloud Run-Worker-Pool bereitstellen
- Nachrichten aus einem Pull-basierten Pub/Sub-Abo abrufen
2. Einrichtung und Anforderungen
Legen Sie zuerst Umgebungsvariablen für dieses Codelab fest:
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
Als Nächstes konfigurieren Sie gcloud für die Verwendung Ihrer Projekt-ID.
gcloud config set project $PROJECT_ID
Bevor Sie mit diesem Codelab beginnen können, müssen Sie die folgenden APIs aktivieren:
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
pubsub.googleapis.com
Erstellen Sie das Dienstkonto mit dem folgenden Befehl:
gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
--display-name="Service account for worker pool codelab"
Gewähren Sie Ihrem Cloud Run-Dienstkonto schließlich Zugriff auf Pub/Sub:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
--role='roles/pubsub.admin'
3. Cloud Run-Worker-Pool erstellen
Erstellen Sie zuerst ein Verzeichnis für den Worker-Pool-Code:
mkdir codelab-worker-pools
cd codelab-worker-pools
Erstellen Sie als Nächstes eine Datei mit dem Namen 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"
}
}
Erstellen Sie nun eine Datei mit dem Namen 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. Worker-Pool bereitstellen
Erstellen Sie den Cloud Run-Worker-Pool mit dem folgenden Befehl:
gcloud beta run worker-pools deploy $WORKER_POOL_NAME --region=$REGION --source .
Mit diesem Befehl wird das Image aus dem Quellcode erstellt und der Job bereitgestellt. Das kann einige Minuten dauern.
5. Nachricht in Pub/Sub veröffentlichen
Pub/Sub-Thema erstellen
gcloud pubsub topics create $TOPIC
Pub/Sub-Pull-Abo erstellen
gcloud pubsub subscriptions create codelab-subscription --topic=$TOPIC
Führen Sie den folgenden Befehl aus, um eine Nachricht in Ihrem Pub/Sub-Thema zu veröffentlichen.
gcloud pubsub topics publish $TOPIC --message "Hello Worker Pools"
Logs für Ihren Worker-Pool ansehen
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
In den Logs sollte Hello Worker Pools
angezeigt werden.
6. Worker-Pool löschen
Da Worker-Pools kontinuierlich ausgeführt werden, sollten Sie den Worker-Pool löschen.
gcloud beta run worker-pools delete $WORKER_POOL_NAME --region $REGION
7. Glückwunsch!
Herzlichen Glückwunsch zum Abschluss des Codelabs!
Wir empfehlen, die Cloud Run-Dokumentation zu lesen.
Behandelte Themen
- Anwendungen erstellen und in einem Cloud Run-Worker-Pool bereitstellen
- Nachrichten aus einem Pull-basierten Pub/Sub-Abo abrufen
8. Bereinigen
Wenn Sie den Cloud Run-Worker-Pool löschen möchten, rufen Sie die Cloud Run Cloud Console unter https://console.cloud.google.com/run auf und löschen Sie den Worker-Pool codelab-workers-pubsub
.
Wenn Sie das gesamte Projekt löschen möchten, rufen Sie Ressourcen verwalten auf, wählen Sie das Projekt aus, das Sie in Schritt 2 erstellt haben, und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie das Projekt in Ihrem Cloud SDK ändern. Sie können die Liste aller verfügbaren Projekte mit gcloud projects list
aufrufen.