1. مقدمه
برای شروع نوشتن توابع Cloud Run، می توانید از کدهای زیر استفاده کنید:
در غیر این صورت، این نرم افزار کد شما را با نحوه ایجاد توابع ابری (نسل دوم) آشنا می کند.
نمای کلی
Cloud Functions (نسل دوم) نسخه بعدی Google Cloud Functions ، ارائه توابع Google Cloud به عنوان یک سرویس است. این نسخه جدید با مجموعه ای از ویژگی های پیشرفته ارائه می شود و اکنون توسط Cloud Run و Eventarc ارائه می شود و به شما کنترل پیشرفته تری بر عملکرد و مقیاس پذیری می دهد و کنترل بیشتری در مورد زمان اجرا و راه اندازی عملکردها از بیش از 90 منبع رویداد می دهد.
این لبه کد شما را در ایجاد توابع Cloud که به تماسهای HTTP پاسخ میدهند و توسط پیامهای Pub/Sub و گزارشهای Cloud Audit فعال میشوند، راهنمایی میکند.
چه خبر؟
این نسخه جدید Cloud Functions یک تجربه پیشرفته FaaS ارائه میکند که توسط Cloud Run، Cloud Build، Artifact Registry و Eventarc ارائه میشود.
زیرساخت های پیشرفته
- پردازش درخواست طولانیتر: عملکردهای Cloud خود را بیش از ۵ دقیقه پیشفرض اجرا کنید، که اجرای بارهای کاری طولانیتر درخواست مانند پردازش جریانهای بزرگ داده از فضای ذخیرهسازی ابری یا BigQuery را آسانتر میکند. برای توابع HTTP، این زمان تا 60 دقیقه است. برای عملکردهای رویداد محور، این در حال حاضر حداکثر 10 دقیقه است.
- موارد بزرگتر: از حداکثر 16 گیگابایت رم و 4 vCPU در توابع Cloud استفاده کنید که به شما امکان می دهد حجم کاری بیشتر در حافظه، محاسبات فشرده و موازی بیشتری داشته باشید.
- همزمانی: تا 1000 درخواست همزمان را با یک نمونه تابع پردازش کنید، شروع سرد را به حداقل میرساند و زمان تاخیر را در مقیاسبندی بهبود میبخشد.
- حداقل نمونهها: نمونههای از پیش گرم شده را برای کاهش شروع سرد خود در نظر بگیرید و مطمئن شوید که زمان بوت استرپ برنامه شما بر عملکرد برنامه تأثیر نمیگذارد.
- تقسیم ترافیک: از چندین نسخه از توابع خود پشتیبانی کنید، ترافیک را بین نسخه های مختلف تقسیم کنید و عملکرد خود را به نسخه قبلی برگردانید.
پوشش گسترده تر رویداد و پشتیبانی از CloudEvents
- ادغام Eventarc: Cloud Functions اکنون شامل پشتیبانی بومی برای Eventarc است که بیش از 90 منبع رویداد را با استفاده از گزارشهای Cloud Audit (BigQuery، Cloud SQL، Cloud Storage...) به ارمغان میآورد، و البته Cloud Functions همچنان از رویدادها از منابع سفارشی با انتشار در Cloud Pub/Sub به طور مستقیم.
- فرمت CloudEvent: همه عملکردهای رویداد محور بدون در نظر گرفتن منبع، به CloudEvents استاندارد صنعت ( cloudevents.io ) پایبند هستند تا از تجربه توسعه دهنده منسجم اطمینان حاصل کنند. محموله ها از طریق یک CloudEvent ساختاریافته با یک بار cloudevent.data ارسال می شوند و استاندارد CloudEvent را پیاده سازی می کنند.
چیزی که یاد خواهید گرفت
- مروری بر عملکردهای ابر (نسل دوم).
- نحوه نوشتن تابعی که به تماس های HTTP پاسخ می دهد.
- نحوه نوشتن تابعی که به پیامهای Pub/Sub پاسخ میدهد.
- نحوه نوشتن تابعی که به رویدادهای Cloud Storage پاسخ می دهد.
- نحوه نوشتن تابعی که به گزارش های حسابرسی ابری پاسخ می دهد.
- نحوه تقسیم ترافیک بین دو نسخه
- نحوه خلاص شدن از شر سرما با حداقل موارد شروع می شود.
- نحوه تنظیم همزمانی
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. شما می توانید آن را در هر زمان به روز کنید.
- شناسه پروژه باید در تمام پروژههای Google Cloud منحصربهفرد باشد و تغییرناپذیر باشد (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (معمولاً به عنوان
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. برای اینکه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید، می توانید منابعی را که ایجاد کرده اید حذف کنید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:
تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این کد لبه را می توان در یک مرورگر انجام داد. شما نیازی به نصب چیزی ندارید.
gcloud را راه اندازی کنید
در Cloud Shell، مطمئن شوید که ID پروژه شما روی یک متغیر PROJECT_ID
و REGION
روی us-west1
تنظیم و ذخیره شده است:
gcloud config set project [YOUR-PROJECT-ID] PROJECT_ID=$(gcloud config get-value project) REGION=us-west1
API ها را فعال کنید
فعال کردن تمام خدمات لازم:
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. تابع HTTP
برای اولین تابع، اجازه دهید یک تابع Node.js احراز هویت شده ایجاد کنیم که به درخواست های HTTP پاسخ می دهد. بیایید همچنین از یک بازه زمانی 10 دقیقه ای استفاده کنیم تا نشان دهیم که چگونه یک تابع می تواند زمان بیشتری برای پاسخ به درخواست های HTTP داشته باشد.
ایجاد کنید
یک پوشه برای برنامه ایجاد کنید و به پوشه بروید:
mkdir ~/hello-http && cd $_
یک فایل index.js
ایجاد کنید که به سادگی به درخواست های HTTP پاسخ می دهد:
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 ثانیه توجه کنید. این به عملکرد اجازه می دهد تا زمان بیشتری برای پاسخ به درخواست های HTTP داشته باشد.
هنگامی که تابع مستقر شد، می توانید آن را در بخش Cloud Functions در Cloud Console مشاهده کنید:
تست کنید
تابع را با دستور زیر تست کنید:
gcloud functions call nodejs-http-function \ --gen2 --region $REGION
شما باید پیام HTTP with Node.js in GCF 2nd gen!
به عنوان پاسخ
4. میخانه / تابع فرعی
برای تابع دوم، بیایید یک تابع پایتون ایجاد کنیم که توسط یک پیام Pub/Sub منتشر شده در یک موضوع خاص راه اندازی می شود.
توکنهای Pub/Sub auth را تنظیم کنید
اگر حساب سرویس Pub/Sub را در تاریخ 8 آوریل 2021 یا قبل از آن فعال کردهاید، نقش iam.serviceAccountTokenCreator
را به حساب سرویس Pub/Sub اعطا کنید:
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 Functions در Cloud Console مشاهده کنید:
تست کنید
عملکرد را با ارسال پیام به موضوع تست کنید:
gcloud pubsub topics publish $TOPIC --message="Hello World"
باید CloudEvent دریافتی را در گزارشها ببینید:
gcloud functions logs read python-pubsub-function \ --region $REGION --gen2 --format "value(log)"
5. عملکرد ذخیره سازی ابری
برای تابع بعدی، اجازه دهید یک تابع Node.js ایجاد کنیم که به رویدادهای یک سطل ذخیرهسازی ابری پاسخ میدهد.
راه اندازی کنید
برای استفاده از توابع Cloud Storage، نقش pubsub.publisher
IAM را به حساب سرویس Cloud Storage اختصاص دهید:
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 Functions در Cloud Console مشاهده کنید.
تست کنید
عملکرد را با آپلود یک فایل در سطل آزمایش کنید:
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. Cloud Audit Logs تابع
برای تابع بعدی، اجازه دهید یک تابع Node.js ایجاد کنیم که یک رویداد Cloud Audit Log را هنگام ایجاد نمونه Compute Engine VM دریافت می کند. در پاسخ، یک برچسب به VM تازه ایجاد شده اضافه می کند که سازنده ماشین مجازی را مشخص می کند.
VMهای موتور محاسباتی جدید ایجاد شده را تعیین کنید
موتور محاسباتی 2 گزارش حسابرسی را هنگام ایجاد یک VM منتشر می کند.
اولین مورد در ابتدای ایجاد VM منتشر می شود و به نظر می رسد:
مورد دوم پس از ایجاد VM منتشر می شود و به شکل زیر است:
به فیلد عملیات با مقادیر first: true
و last: true
توجه کنید. دومین گزارش حسابرسی شامل تمام اطلاعاتی است که برای برچسب گذاری یک نمونه نیاز داریم، بنابراین last: true
برای شناسایی آن در توابع ابری استفاده می کنیم.
راه اندازی کنید
برای استفاده از توابع Cloud Audit Log، باید Audit Logs را برای Eventarc فعال کنید. همچنین باید از یک حساب کاربری با نقش eventarc.eventReceiver
استفاده کنید.
- انواع گزارشهای گزارش حسابرسی Cloud Audit Admin Read ، Data Read و Data Write را برای 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 دریافت میکند. سپس جزئیات نمونه ماشین مجازی موتور محاسباتی را استخراج می کند و یک برچسب روی نمونه ماشین مجازی تنظیم می کند. با خیال راحت به تنهایی index.js
با جزئیات بیشتری مطالعه کنید.
مستقر کنید
می توانید عملکرد را مانند قبل با gcloud
اجرا کنید. به نحوه فیلتر کردن عملکرد در گزارش های حسابرسی برای درج موتور محاسباتی با پرچم --trigger-event-filters
توجه کنید:
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
همچنین میتوانید این عملکرد را اجرا کنید و یک راهانداز Eventarc را از Google Cloud Console اضافه کنید.
ابتدا به بخش Cloud Functions بروید و یک تابع با محیط نسل دوم ایجاد کنید:
روی دکمه Add Eventarc Trigger
کلیک کنید:
این یک پانل جانبی را در سمت راست باز می کند که در آن می توانید ارائه دهندگان رویداد و رویدادهای مختلف را برای ماشه Eventarc انتخاب کنید.
ارائه دهنده رویداد و رویداد مناسب را انتخاب کنید و سپس روی Save Trigger
کلیک کنید:
در نهایت، در صفحه بعد، می توانید فایل های index.js
و package.json
را با فایل های index.js
و package.json
در GitHub به روز کنید و روی دکمه Deploy
کلیک کنید:
تست کنید
برای آزمایش عملکرد Audit Log خود، باید یک ماشین مجازی ماشین محاسباتی در کنسول Cloud ایجاد کنید (همچنین میتوانید ماشینهای مجازی را با gcloud
ایجاد کنید، اما به نظر نمیرسد که گزارش حسابرسی ایجاد کند).
به بخش Compute Engine > VM instances در Cloud Console بروید و یک VM جدید ایجاد کنید. پس از تکمیل ساخت VM، باید برچسب creator
اضافه شده را در VM در کنسول Cloud در بخش اطلاعات پایه یا با استفاده از دستور زیر مشاهده کنید:
gcloud compute instances describe YOUR_VM_NAME
شما باید برچسب را در خروجی مانند مثال زیر ببینید:
... labelFingerprint: ULU6pAy2C7s= labels: creator: atameldev ...
7. تقسیم ترافیک
Cloud Functions (نسل دوم) از ویرایشهای متعدد توابع شما پشتیبانی میکند، ترافیک را بین نسخههای مختلف تقسیم میکند و عملکرد شما را به نسخه قبلی برمیگرداند. این امکان پذیر است زیرا توابع نسل دوم سرویسهای Cloud Run در زیر هود هستند.
در این مرحله، 2 ویرایش از یک تابع را اجرا می کنید و سپس ترافیک را بین آنها 50-50 تقسیم می کنید.
ایجاد کنید
یک پوشه برای برنامه ایجاد کنید و به پوشه بروید:
mkdir ~/traffic-splitting && cd $_
یک فایل 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
در این مرحله، اگر عملکرد را با مشاهده تریگر HTTP (خروجی URI فرمان استقرار بالا) در مرورگر خود آزمایش کنید، باید 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
تست کنید
عملکرد را با مراجعه به URL عمومی آن تست کنید. نیمی از مواقع باید نسخه نارنجی و نیمی دیگر نسخه زرد را ببینید:
برای اطلاعات بیشتر به بازگشت، عرضه تدریجی و انتقال ترافیک مراجعه کنید.
8. حداقل موارد
در توابع ابری (نسل دوم)، میتوان حداقل تعداد نمونههای تابع را تعیین کرد تا گرم نگه داشته شوند و برای ارائه درخواستها آماده باشند. این برای محدود کردن تعداد شروع سرد مفید است.
در این مرحله، یک تابع با مقدار دهی اولیه آهسته اجرا می کنید. مشکل شروع سرد را مشاهده خواهید کرد. سپس، برای خلاص شدن از شر شروع سرد، تابعی را با حداقل مقدار نمونه تنظیم شده روی 1 مستقر خواهید کرد.
ایجاد کنید
یک پوشه برای برنامه ایجاد کنید و به آن بروید:
mkdir ~/min-instances && cd $_
یک فایل main.go
ایجاد کنید. این سرویس Go دارای یک تابع init
است که به مدت 10 ثانیه به خواب می رود تا یک مقداردهی اولیه طولانی را شبیه سازی کند. همچنین دارای یک تابع HelloWorld
است که به تماس های HTTP پاسخ می دهد:
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. همزمانی
در توابع ابری (نسل دوم)، یک نمونه تابع به طور پیشفرض 1 درخواست همزمان را مدیریت میکند، اما میتوانید تعداد درخواستهای همزمانی را که میتوانند بهطور همزمان توسط یک نمونه پردازش شوند، مشخص کنید. این همچنین می تواند در جلوگیری از شروع سرد مفید باشد زیرا نیازی به ایجاد یک نمونه تابع جدید برای هر درخواست موازی نیست.
در این مرحله از تابع با مقدار دهی اولیه آهسته از مرحله قبل استفاده خواهید کرد. شما 10 درخواست برای آن ارسال می کنید و دوباره مشکل شروع سرد را مشاهده می کنید زیرا باید نمونه های تابع جدیدی برای رسیدگی به درخواست ها ایجاد شود.
برای رفع مشکل شروع سرد، تابع دیگری را با مقدار همزمانی 100 مستقر خواهید کرد. مشاهده خواهید کرد که اکنون 10 درخواست مشکل شروع سرد را ایجاد نمی کنند و یک نمونه تابع می تواند همه درخواست ها را مدیریت کند.
تست بدون همزمانی
URL تابع را دریافت کنید:
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 تنظیم کنید (حداکثر می تواند 1000 باشد). این تضمین می کند که حداقل 100 درخواست توسط یک نمونه تابع قابل رسیدگی است:
gcloud run services update slow-concurrent-function \ --concurrency 100 \ --cpu 1 \ --region $REGION
تست همزمان
URL تابع را دریافت کنید:
SLOW_CONCURRENT_URL=$(gcloud functions describe slow-concurrent-function --region $REGION --gen2 --format="value(serviceConfig.uri)")
سپس از hey
برای ارسال 10 درخواست همزمان استفاده کنید:
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. تبریک می گویم!
برای تکمیل کد لبه تبریک می گویم!
آنچه را پوشش داده ایم
- مروری بر عملکردهای ابر (نسل دوم).
- نحوه نوشتن تابعی که به تماس های HTTP پاسخ می دهد.
- نحوه نوشتن تابعی که به پیامهای Pub/Sub پاسخ میدهد.
- نحوه نوشتن تابعی که به رویدادهای Cloud Storage پاسخ می دهد.
- نحوه نوشتن تابعی که به گزارش های حسابرسی ابری پاسخ می دهد.
- نحوه تقسیم ترافیک بین دو نسخه
- نحوه خلاص شدن از شر سرما با حداقل موارد شروع می شود.
- نحوه تنظیم همزمانی