یک استخر کارگر Cloud Run برای اشتراک‌های Pub/Sub مبتنی بر Pull ایجاد کنید

۱. مقدمه

نمای کلی

Worker Poolها منابعی در Cloud Run هستند که به طور خاص برای بارهای کاری بدون درخواست، مانند صف‌های pull، طراحی شده‌اند. توجه داشته باشید که Worker Poolها ویژگی‌های زیر را ندارند:

  • بدون نقطه پایانی/آدرس اینترنتی
  • نیازی نیست کانتینر مستقر شده به درخواست‌ها در یک پورت گوش دهد
  • مقیاس‌بندی خودکار ندارد

در این آزمایشگاه کد، شما یک مخزن داده‌ی کارگر (worker pool) ایجاد خواهید کرد که به طور مداوم پیام‌ها را از اشتراک Pub/Sub pull بازیابی می‌کند. می‌توانید اطلاعات بیشتر در مورد اشتراک‌های Pub/Sub pull را در مستندات و در این مثال کد کسب کنید.

آنچه یاد خواهید گرفت

  • نحوه ایجاد و استقرار در یک مخزن کارگر Cloud Run
  • نحوه بازیابی پیام‌ها از اشتراک Pub/Sub مبتنی بر Pull

۲. تنظیمات و الزامات

ابتدا، متغیرهای محیطی را برای این codelab تنظیم کنید:

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

در مرحله بعد، gcloud را طوری پیکربندی کنید که از شناسه پروژه شما استفاده کند.

gcloud config set project $PROJECT_ID

قبل از اینکه بتوانید از این codelab استفاده کنید، API های زیر را با اجرای دستور زیر فعال کنید:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    artifactregistry.googleapis.com \
    pubsub.googleapis.com

با اجرای دستور زیر، حساب کاربری سرویس را ایجاد کنید:

gcloud iam service-accounts create ${SERVICE_ACCOUNT} \
  --display-name="Service account for worker pool codelab"

در آخر، به حساب سرویس Cloud Run خود دسترسی به PubSub را اعطا کنید:

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$SERVICE_ACCOUNT_EMAIL \
    --role='roles/pubsub.admin'

۳. ایجاد مجموعه کارگران Cloud Run

ابتدا، یک دایرکتوری برای کد worker pool خود ایجاد کنید:

mkdir codelab-worker-pools
cd codelab-worker-pools

در مرحله بعد، فایلی به نام 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"
    }
}

حالا، یک فایل به نام index.js ایجاد کنید:

'use strict';

const subscriptionNameOrId = 'codelab-subscription';

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.

۴. استقرار Worker Pool

با اجرای دستور زیر، مخزن کارگران Cloud Run را ایجاد کنید:

gcloud beta run worker-pools deploy $WORKER_POOL_NAME \
--region=$REGION \
--source . \
--service-account $SERVICE_ACCOUNT_EMAIL

این دستور، ایمیج را از منبع می‌سازد و کار را مستقر می‌کند. تکمیل آن چند دقیقه طول می‌کشد.

۵. انتشار پیام در PubSub

یک موضوع PubSub ایجاد کنید

gcloud pubsub topics create $TOPIC

ایجاد اشتراک PubSub pull

gcloud pubsub subscriptions create codelab-subscription --topic=$TOPIC

دستور زیر را برای انتشار یک پیام در تاپیک PubSub خود اجرا کنید.

gcloud pubsub topics publish $TOPIC --message "Hello Worker Pools"

لاگ‌های مربوط به مجموعه کارگران خود را بررسی کنید

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

شما باید Hello Worker Pools در لاگ‌ها ببینید.

۶. حذف مجموعه کارگران

از آنجایی که worker pool ها به طور مداوم اجرا می‌شوند، باید worker pool را حذف کنید.

gcloud beta run worker-pools delete $WORKER_POOL_NAME --region $REGION

۷. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردید!

توصیه می‌کنیم مستندات Cloud Run را بررسی کنید.

آنچه ما پوشش داده‌ایم

  • نحوه ایجاد و استقرار در یک مخزن کارگر Cloud Run
  • نحوه بازیابی پیام‌ها از اشتراک Pub/Sub مبتنی بر Pull

۸. تمیز کردن

برای حذف مجموعه‌ی کارگران Cloud Run، به کنسول Cloud Run در آدرس https://console.cloud.google.com/run بروید و مجموعه‌ی کارگران codelab-workers-pubsub را حذف کنید.

برای حذف کل پروژه، به مدیریت منابع بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و حذف را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه‌ها را در Cloud SDK خود تغییر دهید. می‌توانید با اجرای gcloud projects list لیست تمام پروژه‌های موجود را مشاهده کنید.