شروع کار با توابع ابری (نسل دوم)

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. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. شما می توانید آن را در هر زمان به روز کنید.
  • شناسه پروژه باید در تمام پروژه‌های Google Cloud منحصربه‌فرد باشد و تغییرناپذیر باشد (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید به شناسه پروژه ارجاع دهید (معمولاً به عنوان PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. برای اینکه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید، می توانید منابعی را که ایجاد کرده اید حذف کنید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

55efc1aaa7a4d3ad.png

تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 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 مشاهده کنید:

7541800e1e3f299f.png

تست کنید

تابع را با دستور زیر تست کنید:

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 مشاهده کنید:

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. عملکرد ذخیره سازی ابری

برای تابع بعدی، اجازه دهید یک تابع 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 منتشر می شود و به نظر می رسد:

8d394a481644c4b6.png

مورد دوم پس از ایجاد VM منتشر می شود و به شکل زیر است:

ee0e221d82887cd1.png

به فیلد عملیات با مقادیر first: true و last: true توجه کنید. دومین گزارش حسابرسی شامل تمام اطلاعاتی است که برای برچسب گذاری یک نمونه نیاز داریم، بنابراین last: true برای شناسایی آن در توابع ابری استفاده می کنیم.

راه اندازی کنید

برای استفاده از توابع Cloud Audit Log، باید Audit Logs را برای Eventarc فعال کنید. همچنین باید از یک حساب کاربری با نقش eventarc.eventReceiver استفاده کنید.

  1. انواع گزارش‌های گزارش حسابرسی Cloud Audit Admin Read ، Data Read و Data Write را برای 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 دریافت می‌کند. سپس جزئیات نمونه ماشین مجازی موتور محاسباتی را استخراج می کند و یک برچسب روی نمونه ماشین مجازی تنظیم می کند. با خیال راحت به تنهایی 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 بروید و یک تابع با محیط نسل دوم ایجاد کنید:

8ba79a12ee152d8.png

روی دکمه Add Eventarc Trigger کلیک کنید:

655346320a5e3631.png

این یک پانل جانبی را در سمت راست باز می کند که در آن می توانید ارائه دهندگان رویداد و رویدادهای مختلف را برای ماشه Eventarc انتخاب کنید.

ارائه دهنده رویداد و رویداد مناسب را انتخاب کنید و سپس روی Save Trigger کلیک کنید:

7d24325ff06c9b05.png

در نهایت، در صفحه بعد، می توانید فایل های index.js و package.json را با فایل های index.js و package.json در GitHub به روز کنید و روی دکمه Deploy کلیک کنید:

f2e338eed2ccf5a2.png

تست کنید

برای آزمایش عملکرد 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 با پس‌زمینه نارنجی ببینید:

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

تست کنید

عملکرد را با مراجعه به URL عمومی آن تست کنید. نیمی از مواقع باید نسخه نارنجی و نیمی دیگر نسخه زرد را ببینید:

36ca0c5f39cc89cf.png391286a08ad3cdde.png

برای اطلاعات بیشتر به بازگشت، عرضه تدریجی و انتقال ترافیک مراجعه کنید.

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]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

این به این دلیل است که نمونه های تابع بیشتری برای رسیدگی به درخواست ها ایجاد می شوند. اگر تعداد نمونه های فعال برای تابع را بررسی کنید، همچنین باید ببینید که بیش از یک نمونه به عنوان یک نقطه ایجاد شده است و اینها مشکل شروع سرد را ایجاد می کنند:

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 تنظیم کنید (حداکثر می تواند 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 پاسخ می دهد.
  • نحوه نوشتن تابعی که به گزارش های حسابرسی ابری پاسخ می دهد.
  • نحوه تقسیم ترافیک بین دو نسخه
  • نحوه خلاص شدن از شر سرما با حداقل موارد شروع می شود.
  • نحوه تنظیم همزمانی