Cloud Functions (2nd gen) का इस्तेमाल शुरू करना

1. परिचय

Cloud Run फ़ंक्शन लिखना शुरू करने के लिए, आप नीचे दिए गए कोडलैब का इस्तेमाल कर सकते हैं:

इसके अलावा, इस कोडलैब में Cloud Functions (दूसरी जनरेशन) बनाने का तरीका बताया गया है.

खास जानकारी

Cloud Functions (2nd gen), Google Cloud Functions का नया वर्शन है. यह Google Cloud की सेवा के तौर पर फ़ंक्शन की सुविधा है. यह नया वर्शन, बेहतर सुविधाओं के साथ आता है. अब यह Cloud Run और Eventarc की मदद से काम करता है. इससे आपको परफ़ॉर्मेंस और स्केलेबिलिटी पर ज़्यादा बेहतर कंट्रोल मिलता है. साथ ही, 90 से ज़्यादा इवेंट सोर्स से फ़ंक्शन के रनटाइम और ट्रिगर पर ज़्यादा कंट्रोल मिलता है.

इस कोडलैब में, एचटीटीपी कॉल का जवाब देने वाले और Pub/Sub मैसेज और Cloud ऑडिट लॉग से ट्रिगर होने वाले Cloud फ़ंक्शन बनाने का तरीका बताया गया है.

नया क्या है?

Cloud Functions के इस नए वर्शन में आपको FaaS का बेहतर अनुभव मिलता है. इसमें Cloud Run, Cloud Build, Artifact Registry, और Eventarc शामिल हैं.

बेहतर इन्फ़्रास्ट्रक्चर

  • ज़्यादा समय तक अनुरोध प्रोसेस करना: अपने Cloud Functions को डिफ़ॉल्ट तौर पर तय किए गए पांच मिनट से ज़्यादा समय तक चलाएं. इससे, ज़्यादा समय तक चलने वाले अनुरोधों को आसानी से चलाया जा सकता है. जैसे, Cloud Storage या BigQuery से डेटा की बड़ी स्ट्रीम को प्रोसेस करना. एचटीटीपी फ़ंक्शन के लिए, यह अवधि 60 मिनट तक हो सकती है. इवेंट-ड्रिवन फ़ंक्शन के लिए, फ़िलहाल यह समय 10 मिनट तक है.
  • बड़े इंस्टेंस: Cloud Functions पर 16 जीबी तक रैम और चार वर्चुअल सीपीयू का फ़ायदा लें. इससे, ज़्यादा मेमोरी, ज़्यादा कंप्यूटिंग, और ज़्यादा पैरलल वर्कलोड की सुविधा मिलती है.
  • एक साथ कई अनुरोध करना: एक फ़ंक्शन इंस्टेंस की मदद से, एक साथ 1,000 अनुरोध प्रोसेस करें. स्केलिंग के दौरान, कोल्ड स्टार्ट को कम किया जा सकता है और इंतज़ार का समय कम किया जा सकता है.
  • कम से कम इंस्टेंस: पहले से गर्म इंस्टेंस दें, ताकि आपके ऐप्लिकेशन को इस्तेमाल करने का समय कम हो जाए. साथ ही, यह पक्का करें कि आपके ऐप्लिकेशन के बूटस्ट्रैप समय से, ऐप्लिकेशन की परफ़ॉर्मेंस पर कोई असर न पड़े.
  • ट्रैफ़िक का बंटवारा: अपने फ़ंक्शन के कई वर्शन इस्तेमाल करें. साथ ही, अलग-अलग वर्शन के बीच ट्रैफ़िक का बंटवारा करें और अपने फ़ंक्शन को पिछले वर्शन पर वापस लाएं.

बड़े इवेंट की कवरेज और CloudEvents के लिए सहायता

  • Eventarc इंटिग्रेशन: Cloud Functions में अब Eventarc के लिए नेटिव सपोर्ट शामिल है. इससे Cloud ऑडिट लॉग (BigQuery, Cloud SQL, Cloud Storage वगैरह) का इस्तेमाल करके, 90 से ज़्यादा इवेंट सोर्स मिलते हैं. साथ ही, Cloud Functions अब भी सीधे Cloud Pub/Sub में पब्लिश करके, कस्टम सोर्स के इवेंट के साथ काम करता है.
  • CloudEvent फ़ॉर्मैट: सभी इवेंट-ड्रिवन फ़ंक्शन, इंडस्ट्री स्टैंडर्ड CloudEvents ( cloudevents.io) का पालन करते हैं. इससे डेवलपर को एक जैसा अनुभव मिलता है, भले ही सोर्स कुछ भी हो. पेलोड, cloudevent.data payload के साथ स्ट्रक्चर्ड CloudEvent के ज़रिए भेजे जाते हैं और CloudEvent स्टैंडर्ड को लागू करते हैं.

आपको क्या सीखने को मिलेगा

  • Cloud Functions (2nd gen) के बारे में खास जानकारी.
  • एचटीटीपी कॉल का जवाब देने वाला फ़ंक्शन लिखने का तरीका.
  • Pub/Sub मैसेज के जवाब देने वाला फ़ंक्शन लिखने का तरीका.
  • Cloud Storage इवेंट के जवाब देने वाला फ़ंक्शन लिखने का तरीका.
  • Cloud ऑडिट लॉग के हिसाब से काम करने वाला फ़ंक्शन लिखने का तरीका.
  • दो बदलावों के बीच ट्रैफ़िक को बांटने का तरीका.
  • कम से कम इंस्टेंस के साथ कोल्ड स्टार्ट से छुटकारा पाने का तरीका.
  • एक साथ कई टास्क करने की सुविधा सेट करने का तरीका.

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेट अप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, आईडी को बदला नहीं जा सकता. सेट अप के बाद इसे बदला नहीं जा सकता. Cloud Console एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है. आम तौर पर, आपको इसकी परवाह नहीं होती कि वह कैसी है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी (आम तौर पर, इसकी पहचान PROJECT_ID के रूप में होता है) की ज़रूरत होती है. अगर आपको जनरेट किया गया आईडी पसंद नहीं आता, तो आप कोई और रैंडम आईडी जनरेट कर सकते हैं. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा.
  • आपकी जानकारी के लिए बता दें कि तीसरी वैल्यू, प्रोजेक्ट नंबर होती है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको Cloud के संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब को चलाने में ज़्यादा खर्च नहीं आता. इस ट्यूटोरियल के बाद, आपसे बिलिंग न की जाए, इसके लिए संसाधनों को बंद किया जा सकता है. इसके लिए, आपने जो संसाधन बनाए हैं उन्हें मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले कार्यक्रम में शामिल हो सकते हैं.

Cloud Shell शुरू करना

Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

Google Cloud Console में, सबसे ऊपर दाएं टूलबार में मौजूद Cloud Shell आइकॉन पर क्लिक करें:

55efc1aaa7a4d3ad.png

एनवायरमेंट से कनेक्ट होने और उसे प्रोवाइड करने में सिर्फ़ कुछ मिनट लगेंगे. प्रोसेस पूरी होने के बाद, आपको कुछ ऐसा दिखेगा:

7ffe5cbb04455448.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल लोड होते हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है. यह Google Cloud पर चलता है, जिससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की सुविधा बेहतर होती है. इस कोडलैब में, सारा काम ब्राउज़र में किया जा सकता है. आपको कुछ भी इंस्टॉल करने की ज़रूरत नहीं है.

gcloud सेट अप करना

Cloud Shell में, पक्का करें कि आपका प्रोजेक्ट आईडी सेट हो और PROJECT_ID वैरिएबल में सेव हो. साथ ही, REGION को us-west1 पर सेट किया गया हो:

gcloud config set project [YOUR-PROJECT-ID]
PROJECT_ID=$(gcloud config get-value project)
REGION=us-west1

एपीआई चालू करें

सभी ज़रूरी सेवाएं चालू करना:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudfunctions.googleapis.com \
  cloudbuild.googleapis.com \
  eventarc.googleapis.com \
  run.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com

3. एचटीटीपी फ़ंक्शन

पहले फ़ंक्शन के लिए, आइए एक Authenticed Node.js फ़ंक्शन बनाते हैं, जो एचटीटीपी अनुरोधों का जवाब देता है. आइए, 10 मिनट के टाइम आउट का इस्तेमाल करके यह भी देखें कि किसी फ़ंक्शन के पास एचटीटीपी अनुरोधों का जवाब देने के लिए ज़्यादा समय कैसे हो सकता है.

बनाएं

ऐप्लिकेशन के लिए फ़ोल्डर बनाएं और उस फ़ोल्डर पर जाएं:

mkdir ~/hello-http && cd $_

ऐसी index.js फ़ाइल बनाएं जो सिर्फ़ एचटीटीपी अनुरोधों का जवाब दे:

const functions = require('@google-cloud/functions-framework');

functions.http('helloWorld', (req, res) => {
  res.status(200).send('HTTP with Node.js in GCF 2nd gen!');
});

डिपेंडेंसी की जानकारी देने के लिए, package.json फ़ाइल बनाएं:

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

डिप्लॉय करना

फ़ंक्शन को डिप्लॉय करने के लिए:

gcloud functions deploy nodejs-http-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --timeout 600s

हालांकि, इस चरण के लिए 600 सेकंड का टाइम आउट ज़रूरी नहीं है, लेकिन इस पर ध्यान दें. इससे फ़ंक्शन को एचटीटीपी अनुरोधों का जवाब देने के लिए, ज़्यादा समय का टाइम आउट मिल जाता है.

फ़ंक्शन को डिप्लॉय करने के बाद, इसे Cloud Console के Cloud Functions सेक्शन में देखा जा सकता है:

7541800e1e3f299f.png

जांच करना

निम्न आदेश के साथ फ़ंक्शन की जांच करें:

gcloud functions call nodejs-http-function \
  --gen2 --region $REGION

आपको जवाब के तौर पर HTTP with Node.js in GCF 2nd gen! मैसेज दिखेगा.

4. Pub/Sub फ़ंक्शन

दूसरे फ़ंक्शन के लिए, किसी खास विषय के लिए पब्लिश किए गए Pub/Sub मैसेज से ट्रिगर होने वाला Python फ़ंक्शन बनाते हैं.

Pub/Sub के पुष्टि करने वाले टोकन सेट अप करना

अगर आपने 8 अप्रैल, 2021 को या उससे पहले Pub/Sub सेवा खाता चालू किया है, तो Pub/Sub सेवा खाते को iam.serviceAccountTokenCreator भूमिका दें:

PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member  serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

बनाएं

सैंपल के लिए इस्तेमाल करने के लिए, Pub/Sub का कोई विषय बनाएं:

TOPIC=cloud-functions-gen2-topic
gcloud pubsub topics create $TOPIC

ऐप्लिकेशन के लिए फ़ोल्डर बनाएं और उस फ़ोल्डर पर जाएं:

mkdir ~/hello-pubsub && cd $_

ऐसी main.py फ़ाइल बनाएं जो सिर्फ़ CloudEvent आईडी वाले मैसेज को लॉग करती हो:

import functions_framework

@functions_framework.cloud_event
def hello_pubsub(cloud_event):
   print('Pub/Sub with Python in GCF 2nd gen! Id: ' + cloud_event['id'])

डिपेंडेंसी की जानकारी देने के लिए, इस कॉन्टेंट के साथ requirements.txt फ़ाइल बनाएं:

functions-framework==3.*

डिप्लॉय करना

फ़ंक्शन को डिप्लॉय करें:

gcloud functions deploy python-pubsub-function \
  --gen2 \
  --runtime python39 \
  --entry-point hello_pubsub \
  --source . \
  --region $REGION \
  --trigger-topic $TOPIC

फ़ंक्शन डिप्लॉय होने के बाद, उसे Cloud Console के Cloud Functions सेक्शन में देखा जा सकता है:

107029714c32baff.png

जांच करना

विषय पर मैसेज भेजकर, इस सुविधा को आज़माएं:

gcloud pubsub topics publish $TOPIC --message="Hello World"

आपको लॉग में, मिला CloudEvent दिखेगा:

gcloud functions logs read python-pubsub-function \
  --region $REGION --gen2 --format "value(log)"

5. Cloud Storage फ़ंक्शन

अगले फ़ंक्शन के लिए, एक Node.js फ़ंक्शन बनाएं, जो Cloud Storage बकेट से आने वाले इवेंट पर प्रतिक्रिया देता हो.

सेट अप करें

Cloud Storage फ़ंक्शन का इस्तेमाल करने के लिए, Cloud Storage सेवा खाते को pubsub.publisher IAM की भूमिका दें:

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/pubsub.publisher

बनाएं

ऐप्लिकेशन के लिए एक फ़ोल्डर बनाएं और उस फ़ोल्डर पर नेविगेट करें:

mkdir ~/hello-storage && cd $_

ऐसी index.js फ़ाइल बनाएं जो सिर्फ़ Cloud Storage इवेंट के जवाब देती हो:

const functions = require('@google-cloud/functions-framework');

functions.cloudEvent('helloStorage', (cloudevent) => {
  console.log('Cloud Storage event with Node.js in GCF 2nd gen!');
  console.log(cloudevent);
});

डिपेंडेंसी की जानकारी देने के लिए, package.json फ़ाइल बनाएं:

{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

डिप्लॉय करना

सबसे पहले, Cloud Storage बकेट बनाएं या किसी मौजूदा बकेट का इस्तेमाल करें:

​​export BUCKET="gs://gcf-gen2-storage-$PROJECT_ID"
gsutil mb -l $REGION $BUCKET

फ़ंक्शन को डिप्लॉय करें:

gcloud functions deploy nodejs-storage-function \
  --gen2 \
  --runtime nodejs16 \
  --entry-point helloStorage \
  --source . \
  --region $REGION \
  --trigger-bucket $BUCKET \
  --trigger-location $REGION

फ़ंक्शन डिप्लॉय होने के बाद, उसे Cloud Console के Cloud Functions सेक्शन में देखा जा सकता है.

जांच करना

बकेट में कोई फ़ाइल अपलोड करके, फ़ंक्शन की जांच करें:

echo "Hello World" > random.txt
gsutil cp random.txt $BUCKET/random.txt

आपको लॉग में, मिला CloudEvent दिखेगा:

gcloud functions logs read nodejs-storage-function \
  --region $REGION --gen2 --limit=100 --format "value(log)"

6. क्लाउड ऑडिट लॉग फ़ंक्शन

अगले फ़ंक्शन के लिए, चलिए Node.js फ़ंक्शन बनाते हैं. Compute Engine वीएम इंस्टेंस बनाए जाने पर, इसे Cloud ऑडिट लॉग इवेंट मिलता है. इसके जवाब में, यह नए बनाए गए वीएम में एक लेबल जोड़ता है. इसमें, वीएम बनाने वाले व्यक्ति की जानकारी होती है.

नए बनाए गए Compute Engine VM का पता लगाना

कोई वीएम बनाने पर, Compute Engine दो ऑडिट लॉग जनरेट करता है.

पहला मैसेज, वीएम बनाने की प्रोसेस शुरू होने पर भेजा जाता है. यह मैसेज कुछ ऐसा दिखता है:

8d394a481644c4b6.png

दूसरा इवेंट, वीएम बनाने के बाद उत्सर्जित होता है और यह ऐसा दिखता है:

ee0e221d82887cd1.png

first: true और last: true वैल्यू वाले ऑपरेशन फ़ील्ड पर ध्यान दें. दूसरे ऑडिट लॉग में, किसी इंस्टेंस को लेबल करने के लिए ज़रूरी सारी जानकारी होती है. इसलिए, हम Cloud Functions में इसका पता लगाने के लिए last: true फ़्लैग का इस्तेमाल करेंगे.

सेट अप करें

Cloud ऑडिट लॉग फ़ंक्शन का इस्तेमाल करने के लिए, आपको Eventarc के लिए ऑडिट लॉग चालू करने होंगे. आपको eventarc.eventReceiver भूमिका वाले सेवा खाते का इस्तेमाल भी करना होगा.

  1. Compute Engine API के लिए, क्लाउड ऑडिट लॉग, एडमिन रीड, डेटा रीड, और डेटा राइट लॉग टाइप चालू करें:

76b7417ea4071241.png

  1. डिफ़ॉल्ट Compute Engine सेवा खाते को eventarc.eventReceiver IAM भूमिका दें:
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
  --role roles/eventarc.eventReceiver

कोड प्राप्त करें

उस रेपो का क्लोन बनाएं जिसमें ऐप्लिकेशन मौजूद है:

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

ऐप्लिकेशन डायरेक्ट्री पर जाएं:

cd eventarc-samples/gce-vm-labeler/gcf/nodejs

index.js फ़ाइल में वह ऐप्लिकेशन कोड होता है जिसे CloudEvent में रैप किया गया ऑडिट लॉग मिलता है. इसके बाद, यह Compute Engine के वीएम इंस्टेंस की जानकारी निकालता है और वीएम इंस्टेंस पर एक लेबल सेट करता है. index.js के बारे में ज़्यादा जानने के लिए, यहां दी गई जानकारी देखें.

डिप्लॉय करें

फ़ंक्शन को पहले की तरह gcloud के साथ डिप्लॉय किया जा सकता है. ध्यान दें कि फ़ंक्शन, --trigger-event-filters फ़्लैग के साथ Compute Engine इंसर्शन के लिए ऑडिट लॉग को कैसे फ़िल्टर कर रहा है:

gcloud functions deploy gce-vm-labeler \
  --gen2 \
  --runtime nodejs16 \
  --entry-point labelVmCreation \
  --source . \
  --region $REGION \
  --trigger-event-filters="type=google.cloud.audit.log.v1.written,serviceName=compute.googleapis.com,methodName=beta.compute.instances.insert" \
  --trigger-location us-central1

Google Cloud Console से भी फ़ंक्शन को डिप्लॉय किया जा सकता है और Eventarc ट्रिगर जोड़ा जा सकता है.

सबसे पहले, Cloud Functions सेक्शन में जाएं और दूसरे जनरेशन वाले एनवायरमेंट के साथ फ़ंक्शन बनाएं:

8ba79a12ee152d8.png

Add Eventarc Trigger बटन पर क्लिक करें:

655346320a5e3631.png

इससे दाईं ओर एक साइड पैनल खुलता है. यहां Eventarc ट्रिगर के लिए, अलग-अलग इवेंट प्रोवाइडर और इवेंट चुने जा सकते हैं.

इवेंट की सेवा देने वाली सही कंपनी और इवेंट चुनें. इसके बाद, Save Trigger पर क्लिक करें:

7d24325ff06c9b05.png

आखिर में, अगले पेज पर, GitHub पर index.js और package.json फ़ाइलों की मदद से, index.js और package.json फ़ाइलों को अपडेट किया जा सकता है. इसके बाद, Deploy बटन पर क्लिक करें:

f2e338eed2ccf5a2.png

जांच करना

अपने ऑडिट लॉग फ़ंक्शन की जांच करने के लिए, आपको Cloud Console में एक Compute Engine वीएम बनाना होगा (आप gcloud का इस्तेमाल करके भी वीएम बना सकते हैं, लेकिन ऐसा लगता है कि यह ऑडिट लॉग जनरेट नहीं करता है).

Cloud Console के Compute Engine > VM इंस्टेंस सेक्शन पर जाएं और नया VM बनाएं. वीएम बनाने की प्रोसेस पूरी होने के बाद, आपको Cloud Console में सामान्य जानकारी सेक्शन में या नीचे दिए गए निर्देश का इस्तेमाल करके, वीएम पर जोड़ा गया creator लेबल दिखेगा:

gcloud compute instances describe YOUR_VM_NAME

आपको आउटपुट में लेबल, इस उदाहरण की तरह दिखेगा:

...
labelFingerprint: ULU6pAy2C7s=
labels:
  creator: atameldev
...

7. ट्रैफ़िक का बंटवारा

Cloud Functions (2nd gen) में, आपके फ़ंक्शन के कई रिविज़न इस्तेमाल किए जा सकते हैं. साथ ही, अलग-अलग रिविज़न के बीच ट्रैफ़िक को बांटा जा सकता है और अपने फ़ंक्शन को पिछले वर्शन पर वापस लाया जा सकता है. ऐसा इसलिए किया जा सकता है, क्योंकि दूसरे जनरेशन के फ़ंक्शन, Cloud Run की सेवाएं हैं.

इस चरण में, आपको किसी फ़ंक्शन के दो रिविज़न डिप्लॉय करने होंगे. इसके बाद, ट्रैफ़िक को 50-50 के हिसाब से उनके बीच बांटना होगा.

बनाएं

ऐप्लिकेशन के लिए फ़ोल्डर बनाएं और उस फ़ोल्डर पर जाएं:

mkdir ~/traffic-splitting && cd $_

Python फ़ंक्शन के साथ ऐसी main.py फ़ाइल बनाएं जो कलर एनवायरमेंट वैरिएबल को पढ़े और उसी बैकग्राउंड कलर में Hello World की मदद से जवाब दे:

import os

color = os.environ.get('COLOR')

def hello_world(request):
    return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'

डिप्लॉय करें

नारंगी बैकग्राउंड वाले फ़ंक्शन का पहला रिविज़न डिप्लॉय करें:

COLOR=orange
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

इस समय, अगर आपने अपने ब्राउज़र में एचटीटीपी ट्रिगर (ऊपर दिए गए डिप्लॉयमेंट कमांड का यूआरआई आउटपुट) देखकर फ़ंक्शन की जांच की, तो आपको नारंगी बैकग्राउंड वाला Hello World दिखेगा:

36ca0c5f39cc89cf.png

पीले बैकग्राउंड के साथ दूसरा बदलाव डिप्लॉय करें:

COLOR=yellow
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR

यह बदलाव हाल ही में किया गया है. इसलिए, फ़ंक्शन की जांच करने पर, आपको पीले बैकग्राउंड वाला Hello World दिखेगा:

391286a08ad3cdde.png

ट्रैफ़िक को 50-50 बांटना

ट्रैफ़िक को ऑरेंज और पीले रंग के रिविज़न के बीच बांटने के लिए, आपको Cloud Run की सेवाओं के रिविज़न आईडी ढूंढने होंगे. बदलाव के आईडी देखने के लिए यह कमांड इस्तेमाल करें:

gcloud run revisions list --service hello-world-colored \
  --region $REGION --format 'value(REVISION)'

आउटपुट कुछ ऐसा दिखना चाहिए:

hello-world-colored-00001-man
hello-world-colored-00002-wok

अब, इन दोनों रिविज़न के बीच ट्रैफ़िक को इस तरह बांटें (अपने रिविज़न के नाम के हिसाब से X-XXX को अपडेट करें):

gcloud run services update-traffic hello-world-colored \
  --region $REGION \
  --to-revisions hello-world-colored-0000X-XXX=50,hello-world-colored-0000X-XXX=50

जांच करना

फ़ंक्शन के सार्वजनिक यूआरएल पर जाकर, उसकी जांच करें. आधे समय आपको नारंगी रंग में बदलाव दिखेगा और आधे समय पीले रंग में:

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

ज़्यादा जानकारी के लिए, रोलबैक, धीरे-धीरे रोल आउट करना, और ट्रैफ़िक माइग्रेट करना देखें.

8. कम से कम इंस्टेंस

Cloud Functions (2nd gen) में, गर्म रखने और अनुरोधों को पेश करने के लिए फ़ंक्शन इंस्टेंस की कम से कम संख्या तय की जा सकती है. यह कोल्ड स्टार्ट की संख्या को सीमित करने में मददगार होता है.

इस चरण में, आपको धीमी शुरुआत वाले फ़ंक्शन को डिप्लॉय करना होगा. आपको कोल्ड स्टार्ट की समस्या दिखेगी. इसके बाद, कोल्ड स्टार्ट की समस्या से बचने के लिए, फ़ंक्शन को 1 पर सेट की गई इंस्टेंस वैल्यू के साथ डिप्लॉय किया जाएगा.

बनाएं

ऐप्लिकेशन के लिए फ़ोल्डर बनाएं और उस पर जाएं:

mkdir ~/min-instances && cd $_

main.go फ़ाइल बनाएं. इस Go सेवा में एक init फ़ंक्शन है, जो लंबे समय तक चलने वाले इनिशिएलाइज़ेशन को सिम्युलेट करने के लिए 10 सेकंड के लिए रुकता है. इसमें HelloWorld फ़ंक्शन भी है, जो एचटीटीपी कॉल का जवाब देता है:

package p

import (
        "fmt"
        "net/http"
        "time"
)

func init() {
        time.Sleep(10 * time.Second)
}

func HelloWorld(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Slow HTTP Go in GCF 2nd gen!")
}

डिप्लॉय करना

फ़ंक्शन के पहले बदलाव को, डिफ़ॉल्ट रूप से कम से कम इंस्टेंस वैल्यू शून्य के साथ डिप्लॉय करें:

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated

इस निर्देश की मदद से फ़ंक्शन की जांच करें:

gcloud functions call slow-function \
  --gen2 --region $REGION

आपको पहले कॉल में 10 सेकंड का इंतज़ार (कोल्ड स्टार्ट) दिखेगा. इसके बाद, आपको मैसेज दिखेगा. इसके बाद आने वाले कॉल तुरंत आ जाएंगे.

कम से कम इंस्टेंस सेट करना

पहले अनुरोध पर कोल्ड स्टार्ट की समस्या से बचने के लिए, --min-instances फ़्लैग को 1 पर सेट करके फ़ंक्शन को फिर से डिप्लॉय करें. इसके लिए, यह तरीका अपनाएं:

gcloud functions deploy slow-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

जांच करना

फ़ंक्शन को फिर से टेस्ट करें:

gcloud functions call slow-function \
  --gen2 --region $REGION

आपको पहले अनुरोध में अब 10 सेकंड की देरी नहीं दिखनी चाहिए. पहली बार शुरू करने पर (लंबे समय के बाद) की कोल्ड स्टार्ट की समस्या अब खत्म हो गई है. कम से कम इंस्टेंस की वजह से ऐसा होता है!

ज़्यादा जानकारी के लिए, कम से कम इंस्टेंस का इस्तेमाल करना देखें.

9. एक साथ कई काम करना

Cloud Functions (दूसरे जनरेशन) में, फ़ंक्शन इंस्टेंस डिफ़ॉल्ट रूप से एक ही समय पर एक अनुरोध को प्रोसेस करता है. हालांकि, यह तय किया जा सकता है कि एक ही समय पर कितने अनुरोध प्रोसेस किए जा सकते हैं. यह सुविधा, फ़ंक्शन को फिर से शुरू होने से रोकने में भी मददगार हो सकती है. ऐसा इसलिए, क्योंकि हर पैरलल अनुरोध के लिए, नया फ़ंक्शन इंस्टेंस बनाने की ज़रूरत नहीं होती.

इस चरण में, आपको पिछले चरण में इस्तेमाल किए गए फ़ंक्शन को स्लो इनिशलाइज़ेशन के साथ इस्तेमाल करना होगा. आपको इसे 10 अनुरोध भेजने होंगे और फिर से कोल्ड स्टार्ट की समस्या देखनी होगी, क्योंकि अनुरोधों को मैनेज करने के लिए नए फ़ंक्शन इंस्टेंस बनाने होंगे.

कोल्ड-स्टार्ट की समस्या को ठीक करने के लिए, आपको एक और फ़ंक्शन को डिप्लॉय करना होगा. इस फ़ंक्शन में, एक साथ कई अनुरोधों को प्रोसेस करने की वैल्यू 100 होगी. आपको पता चलेगा कि अब 10 अनुरोधों की वजह से, कोल्ड स्टार्ट की समस्या नहीं होती. साथ ही, एक फ़ंक्शन इंस्टेंस सभी अनुरोधों को हैंडल कर सकता है.

एक साथ कई टेस्ट चलाए बिना टेस्ट करना

फ़ंक्शन का यूआरएल पाएं:

SLOW_URL=$(gcloud functions describe slow-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

धीमे फ़ंक्शन को एक साथ 10 अनुरोध भेजने के लिए, hey नाम के ओपन सोर्स मानदंड टूल का इस्तेमाल करें. hey पहले से Cloud Shell में इंस्टॉल है:

hey -n 10 -c 10 $SLOW_URL

आपको hey के आउटपुट में दिखेगा कि कुछ अनुरोधों को पूरा होने में ज़्यादा समय लग रहा है:

Summary:
  Total:        10.9053 secs
  Slowest:      10.9048 secs
  Fastest:      0.4439 secs
  Average:      9.7930 secs
  Requests/sec: 0.9170

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.444 [1]     |■■■■
  1.490 [0]     |
  2.536 [0]     |
  3.582 [0]     |
  4.628 [0]     |
  5.674 [0]     |
  6.720 [0]     |
  7.767 [0]     |
  8.813 [0]     |
  9.859 [0]     |
  10.905 [9]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

इसकी वजह यह है कि अनुरोधों को हैंडल करने के लिए, ज़्यादा फ़ंक्शन इंस्टेंस बनाए जा रहे हैं. अगर फ़ंक्शन के लिए ऐक्टिव इंस्टेंस की संख्या देखी जाती है, तो आपको यह भी दिखेगा कि किसी समय एक से ज़्यादा इंस्टेंस बनाए गए थे और इनकी वजह से कोल्ड स्टार्ट की समस्या आ रही है:

9f5c6877836d62fb.png

डिप्लॉय करें

पिछले फ़ंक्शन के जैसा नया फ़ंक्शन डिप्लॉय करें. डिप्लॉय करने के बाद, एक साथ कई टास्क करने की सुविधा को बढ़ाया जा सकता है:

gcloud functions deploy slow-concurrent-function \
  --gen2 \
  --runtime go116 \
  --entry-point HelloWorld \
  --source . \
  --region $REGION \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1

एक साथ कई टास्क चलाने की सुविधा सेट करना

पहले से मौजूद Cloud Run सेवा के लिए, फ़ंक्शन को 100 पर सेट करें. यह वैल्यू ज़्यादा से ज़्यादा 1,000 हो सकती है. इससे यह पक्का होता है कि एक फ़ंक्शन इंस्टेंस से कम से कम 100 अनुरोधों को मैनेज किया जा सकता है:

gcloud run services update slow-concurrent-function \
  --concurrency 100 \
  --cpu 1 \
  --region $REGION 

एक साथ कई वर्शन आज़माना

फ़ंक्शन का यूआरएल पाएं:

SLOW_CONCURRENT_URL=$(gcloud functions describe slow-concurrent-function --region $REGION --gen2 --format="value(serviceConfig.uri)")

इसके बाद, एक साथ 10 अनुरोध भेजने के लिए, hey का इस्तेमाल करें:

hey -n 10 -c 10 $SLOW_CONCURRENT_URL

आपको hey के आउटपुट में दिखेगा कि सभी अनुरोध तुरंत प्रोसेस हो गए हैं:

Summary:
  Total:        0.2164 secs
  Slowest:      0.2163 secs
  Fastest:      0.0921 secs
  Average:      0.2033 secs
  Requests/sec: 46.2028

  Total data:   310 bytes
  Size/request: 31 bytes

Response time histogram:
  0.092 [1]     |■■■■
  0.105 [0]     |
  0.117 [0]     |
  0.129 [0]     |
  0.142 [0]     |
  0.154 [0]     |
  0.167 [0]     |
  0.179 [0]     |
  0.191 [0]     |
  0.204 [0]     |
  0.216 [9]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

एक फ़ंक्शन इंस्टेंस, सभी अनुरोधों को हैंडल कर पा रहा था. साथ ही, एक साथ कई अनुरोधों को प्रोसेस करने की सुविधा की वजह से, कोल्ड स्टार्ट की समस्या भी खत्म हो गई!

ज़्यादा जानकारी के लिए, एक साथ कई टास्क देखें.

10. बधाई हो!

कोडलैब पूरा करने के लिए बधाई!

हमने क्या-क्या शामिल किया है

  • Cloud Functions (2nd gen) के बारे में खास जानकारी.
  • एचटीटीपी कॉल का जवाब देने वाला फ़ंक्शन लिखने का तरीका.
  • Pub/Sub मैसेज के जवाब देने वाला फ़ंक्शन लिखने का तरीका.
  • Cloud Storage इवेंट के जवाब देने वाला फ़ंक्शन लिखने का तरीका.
  • Cloud ऑडिट लॉग के हिसाब से काम करने वाला फ़ंक्शन लिखने का तरीका.
  • दो बदलावों के बीच ट्रैफ़िक को बांटने का तरीका.
  • कम से कम इंस्टेंस के साथ कोल्ड स्टार्ट से छुटकारा पाने का तरीका.
  • एक साथ कई टास्क करने की सुविधा सेट करने का तरीका.