पुल-आधारित Pub/Sub सदस्यताओं के लिए, Cloud Run वर्कर पूल बनाना

1. परिचय

खास जानकारी

वर्कर्स पूल, Cloud Run का एक संसाधन है. इसे खास तौर पर अनुरोध के बिना चलने वाले वर्कलोड के लिए डिज़ाइन किया गया है. जैसे, पुल कतारें. ध्यान दें कि वर्कर्स पूल में ये सुविधाएं नहीं होती हैं:

  • कोई एंडपॉइंट/यूआरएल नहीं
  • डिप्लॉय किए गए कंटेनर को किसी पोर्ट पर अनुरोधों को सुनने की ज़रूरत नहीं होती
  • अपने-आप स्केलिंग नहीं होती

इस कोडलैब में, आपको एक वर्कर्स पूल बनाना होगा. यह पूल, 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 पर मैसेज पब्लिश करना

PubSub विषय बनाना

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 वर्कर्स पूल मिटाने के लिए, https://console.cloud.google.com/run पर Cloud Run Cloud Console पर जाएं और codelab-workers-pubsub वर्कर्स पूल मिटाएं.

पूरे प्रोजेक्ट को मिटाने के लिए, संसाधन मैनेज करें पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और 'मिटाएं' को चुनें. प्रोजेक्ट मिटाने पर, आपको अपने Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.