إنشاء مجموعة عمّال في Cloud Run للاشتراكات المستندة إلى السحب في Pub/Sub

1. مقدمة

نظرة عامة

مجموعات العاملين هي أحد موارد Cloud Run المصمَّمة خصيصًا لأحمال العمل غير المرتبطة بالطلبات، مثل قوائم انتظار السحب. يُرجى العِلم أنّ مجموعات العاملين لا تتضمّن الميزات التالية:

  • ما مِن نقطة نهاية أو عنوان URL
  • لا يُشترَط أن يستمع الحاوي الذي تم نشره إلى الطلبات على منفذ
  • عدم التدرّج التلقائي

في هذا الدرس العملي، ستنشئ مجموعة من العاملين تسترد الرسائل باستمرار من اشتراك سحب في Pub/Sub. يمكنك الاطّلاع على مزيد من المعلومات حول اشتراكات السحب في Pub/Sub في المستندات وفي مثال الرمز البرمجي هذا.

المُعطيات

  • كيفية إنشاء مجموعة عاملة ونشرها على Cloud Run
  • كيفية استرداد الرسائل من اشتراك Pub/Sub يستند إلى عملية السحب

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

قبل البدء في استخدام هذا الدرس التطبيقي، فعِّل واجهات برمجة التطبيقات التالية من خلال تنفيذ ما يلي:

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 من خلال تنفيذ الأمر التالي:

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

ينشئ هذا الأمر الصورة من المصدر وينشر المهمة. سيستغرق إكمال هذه الخطوة بضع دقائق.

5- نشر رسالة إلى PubSub

إنشاء موضوع Pub/Sub

gcloud pubsub topics create $TOPIC

إنشاء اشتراك سحب في PubSub

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 يستند إلى عملية السحب

8. تَنظيم

لحذف مجموعة العاملين في Cloud Run، انتقِل إلى Cloud Run Cloud Console على https://console.cloud.google.com/run واحذف مجموعة العاملين codelab-workers-pubsub.

لحذف المشروع بأكمله، انتقِل إلى إدارة المراجع، واختَر المشروع الذي أنشأته في الخطوة 2، ثم انقر على "حذف". إذا حذفت المشروع، عليك تغيير المشاريع في Cloud SDK. يمكنك الاطّلاع على قائمة بجميع المشاريع المتاحة من خلال تنفيذ gcloud projects list.