पुल-आधारित 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 = '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.

4. वर्कर पूल डिप्लॉय करना

Cloud Run वर्कर पूल बनाने के लिए, यह कमांड चलाएं:

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

यह कमांड, सोर्स से इमेज बनाती है और जॉब को डिप्लॉय करती है. इस प्रोसेस को पूरा होने में कुछ मिनट लगेंगे.

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

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