1. परिचय
Cloud Run फ़ंक्शन लिखना शुरू करने के लिए, आप नीचे दिए गए कोडलैब का इस्तेमाल कर सकते हैं:
- एचटीटीपी क्लाउड रन फ़ंक्शन का इस्तेमाल शुरू करना
- इवेंट-ड्रिवन 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. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेट अप करना
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.
- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
- प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, आईडी को बदला नहीं जा सकता. सेट अप के बाद इसे बदला नहीं जा सकता. Cloud Console एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है. आम तौर पर, आपको इसकी परवाह नहीं होती कि वह कैसी है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी (आम तौर पर, इसकी पहचान
PROJECT_ID
के रूप में होता है) की ज़रूरत होती है. अगर आपको जनरेट किया गया आईडी पसंद नहीं आता, तो आप कोई और रैंडम आईडी जनरेट कर सकते हैं. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा. - आपकी जानकारी के लिए बता दें कि तीसरी वैल्यू, प्रोजेक्ट नंबर होती है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
- इसके बाद, आपको Cloud के संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब को चलाने में ज़्यादा खर्च नहीं आता. इस ट्यूटोरियल के बाद, आपसे बिलिंग न की जाए, इसके लिए संसाधनों को बंद किया जा सकता है. इसके लिए, आपने जो संसाधन बनाए हैं उन्हें मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले कार्यक्रम में शामिल हो सकते हैं.
Cloud Shell शुरू करना
Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
Google Cloud Console में, सबसे ऊपर दाएं टूलबार में मौजूद Cloud Shell आइकॉन पर क्लिक करें:
एनवायरमेंट से कनेक्ट होने और उसे प्रोवाइड करने में सिर्फ़ कुछ मिनट लगेंगे. प्रोसेस पूरी होने के बाद, आपको कुछ ऐसा दिखेगा:
इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल लोड होते हैं. यह 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 सेक्शन में देखा जा सकता है:
जांच करना
निम्न आदेश के साथ फ़ंक्शन की जांच करें:
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 सेक्शन में देखा जा सकता है:
जांच करना
विषय पर मैसेज भेजकर, इस सुविधा को आज़माएं:
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 दो ऑडिट लॉग जनरेट करता है.
पहला मैसेज, वीएम बनाने की प्रोसेस शुरू होने पर भेजा जाता है. यह मैसेज कुछ ऐसा दिखता है:
दूसरा इवेंट, वीएम बनाने के बाद उत्सर्जित होता है और यह ऐसा दिखता है:
first: true
और last: true
वैल्यू वाले ऑपरेशन फ़ील्ड पर ध्यान दें. दूसरे ऑडिट लॉग में, किसी इंस्टेंस को लेबल करने के लिए ज़रूरी सारी जानकारी होती है. इसलिए, हम Cloud Functions में इसका पता लगाने के लिए last: true
फ़्लैग का इस्तेमाल करेंगे.
सेट अप करें
Cloud ऑडिट लॉग फ़ंक्शन का इस्तेमाल करने के लिए, आपको Eventarc के लिए ऑडिट लॉग चालू करने होंगे. आपको eventarc.eventReceiver
भूमिका वाले सेवा खाते का इस्तेमाल भी करना होगा.
- Compute Engine API के लिए, क्लाउड ऑडिट लॉग, एडमिन रीड, डेटा रीड, और डेटा राइट लॉग टाइप चालू करें:
- डिफ़ॉल्ट 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 सेक्शन में जाएं और दूसरे जनरेशन वाले एनवायरमेंट के साथ फ़ंक्शन बनाएं:
Add Eventarc Trigger
बटन पर क्लिक करें:
इससे दाईं ओर एक साइड पैनल खुलता है. यहां Eventarc ट्रिगर के लिए, अलग-अलग इवेंट प्रोवाइडर और इवेंट चुने जा सकते हैं.
इवेंट की सेवा देने वाली सही कंपनी और इवेंट चुनें. इसके बाद, Save Trigger
पर क्लिक करें:
आखिर में, अगले पेज पर, GitHub पर index.js
और package.json
फ़ाइलों की मदद से, index.js
और package.json
फ़ाइलों को अपडेट किया जा सकता है. इसके बाद, Deploy
बटन पर क्लिक करें:
जांच करना
अपने ऑडिट लॉग फ़ंक्शन की जांच करने के लिए, आपको 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
दिखेगा:
पीले बैकग्राउंड के साथ दूसरा बदलाव डिप्लॉय करें:
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
दिखेगा:
ट्रैफ़िक को 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
जांच करना
फ़ंक्शन के सार्वजनिक यूआरएल पर जाकर, उसकी जांच करें. आधे समय आपको नारंगी रंग में बदलाव दिखेगा और आधे समय पीले रंग में:
ज़्यादा जानकारी के लिए, रोलबैक, धीरे-धीरे रोल आउट करना, और ट्रैफ़िक माइग्रेट करना देखें.
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] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
इसकी वजह यह है कि अनुरोधों को हैंडल करने के लिए, ज़्यादा फ़ंक्शन इंस्टेंस बनाए जा रहे हैं. अगर फ़ंक्शन के लिए ऐक्टिव इंस्टेंस की संख्या देखी जाती है, तो आपको यह भी दिखेगा कि किसी समय एक से ज़्यादा इंस्टेंस बनाए गए थे और इनकी वजह से कोल्ड स्टार्ट की समस्या आ रही है:
डिप्लॉय करें
पिछले फ़ंक्शन के जैसा नया फ़ंक्शन डिप्लॉय करें. डिप्लॉय करने के बाद, एक साथ कई टास्क करने की सुविधा को बढ़ाया जा सकता है:
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 ऑडिट लॉग के हिसाब से काम करने वाला फ़ंक्शन लिखने का तरीका.
- दो बदलावों के बीच ट्रैफ़िक को बांटने का तरीका.
- कम से कम इंस्टेंस के साथ कोल्ड स्टार्ट से छुटकारा पाने का तरीका.
- एक साथ कई टास्क करने की सुविधा सेट करने का तरीका.