Çekmeye dayalı Pub/Sub abonelikleri için Cloud Run çalışan havuzu oluşturma

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.