1. Giriş
Genel Bakış
Çalışan havuzları, özellikle çekme sıraları gibi istek dışı iş yükleri için tasarlanmış bir Cloud Run kaynağıdır. İşçi havuzlarında aşağıdaki özelliklerin bulunmadığını unutmayın:
- Uç nokta/URL yok
- Dağıtılan kapsayıcının bir bağlantı noktasındaki istekleri dinlemesi gerekmez.
- Otomatik ölçeklendirme yok
Bu codelab'de, Pub/Sub çekme aboneliğinden sürekli olarak mesaj alacak bir çalışan havuzu oluşturacaksınız. Pub/Sub çekme abonelikleri hakkında daha fazla bilgiyi belgelerde ve bu kod örneğinde bulabilirsiniz.
Neler öğreneceksiniz?
- Cloud Run çalışan havuzu oluşturma ve dağıtma
- Çekmeye dayalı Pub/Sub aboneliğinden mesajları alma
2. Kurulum ve Gereksinimler
Öncelikle bu codelab için ortam değişkenlerini ayarlayın:
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
Ardından, gcloud'u proje kimliğinizi kullanacak şekilde yapılandırın.
gcloud config set project $PROJECT_ID
Bu codelab'i kullanmaya başlamadan önce aşağıdaki API'leri etkinleştirin:
gcloud services enable run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
pubsub.googleapis.com
Aşağıdaki komutu çalıştırarak hizmet hesabını oluşturun:
gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
--display-name="Service account for worker pool codelab"
Son olarak, Cloud Run hizmet hesabınıza Pub/Sub erişimi verin:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
--role='roles/pubsub.admin'
3. Cloud Run çalışan havuzunu oluşturma
Öncelikle çalışan havuzu kodunuz için bir dizin oluşturun:
mkdir codelab-worker-pools
cd codelab-worker-pools
Ardından, package.json
adlı bir dosya oluşturun.
{
"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"
}
}
Şimdi index.js
adlı bir dosya oluşturun:
'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. Çalışan havuzunu dağıtma
Aşağıdaki komutu çalıştırarak Cloud Run çalışan havuzunu oluşturun:
gcloud beta run worker-pools deploy $WORKER_POOL_NAME --region=$REGION --source .
Bu komut, görüntüyü kaynaktan oluşturur ve işi dağıtır. Bu işlemin tamamlanması birkaç dakika sürer.
5. PubSub'da mesaj yayınlama
PubSub konusu oluşturma
gcloud pubsub topics create $TOPIC
PubSub çekme aboneliği oluşturma
gcloud pubsub subscriptions create codelab-subscription --topic=$TOPIC
Pub/Sub konunuzda mesaj yayınlamak için aşağıdaki komutu çalıştırın.
gcloud pubsub topics publish $TOPIC --message "Hello Worker Pools"
Çalışan havuzunuzun günlüklerini kontrol etme
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
Günlüklerde Hello Worker Pools
simgesini görmeniz gerekir.
6. Çalışan havuzunu silme
Çalışan havuzları sürekli olarak çalıştığından çalışan havuzunu silmeniz gerekir.
gcloud beta run worker-pools delete $WORKER_POOL_NAME --region $REGION
7. Tebrikler!
Codelab'i tamamladığınız için tebrikler.
Cloud Run belgelerini incelemenizi öneririz.
İşlediğimiz konular
- Cloud Run çalışan havuzu oluşturma ve dağıtma
- Çekmeye dayalı Pub/Sub aboneliğinden mesajları alma
8. Temizleme
Cloud Run işçi havuzunu silmek için https://console.cloud.google.com/run adresinden Cloud Run Cloud Console'a gidin ve codelab-workers-pubsub
işçi havuzunu silin.
Projenin tamamını silmek için Kaynakları Yönet'e gidin, 2. adımda oluşturduğunuz projeyi seçin ve Sil'i tıklayın. Projeyi silerseniz Cloud SDK'nızda projeleri değiştirmeniz gerekir. gcloud projects list
komutunu çalıştırarak kullanılabilir tüm projelerin listesini görüntüleyebilirsiniz.