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

1. مقدمه

نمای کلی

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

  • بدون نقطه پایانی/URL
  • هیچ الزامی برای کانتینر مستقر برای گوش دادن به درخواست ها در یک پورت وجود ندارد
  • بدون پوسته پوسته شدن خودکار

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

چیزی که یاد خواهید گرفت

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

2. راه اندازی و الزامات

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

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

قبل از اینکه بتوانید از این کد لبه استفاده کنید، 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'

3. استخر کارگر Cloud Run را ایجاد کنید

ابتدا یک دایرکتوری برای کد استخر کارگر خود ایجاد کنید:

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 = '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. استخر کارگر را مستقر کنید

با اجرای دستور زیر، Cloud Run worker pool را ایجاد کنید:

gcloud beta run worker-pools deploy $WORKER_POOL_NAME --region=$REGION --source .

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

5. یک پیام به 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 در گزارش‌ها ببینید.

6. استخر کارگر را حذف کنید

از آنجایی که استخرهای کارگر به طور مداوم اجرا می شوند، باید استخر کارگر را حذف کنید.

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

7. تبریک می گویم!

برای تکمیل کد لبه تبریک می گویم!

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

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

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

8. پاکسازی کنید

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

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