بدء استخدام Cloud Functions (الجيل الثاني)

1. مقدمة

للبدء في كتابة دوالّ Cloud Run، يمكنك استخدام مختبرات رموز البرامج التالية:

بخلاف ذلك، يرشدك هذا الدليل التعليمي إلى كيفية إنشاء وظائف Cloud (الجيل الثاني).

نظرة عامة

‫Cloud Functions (الجيل الثاني) هو الإصدار التالي من Google Cloud Functions، وهي خدمة Functions-as-a-Service (وظائف كخدمة) من Google Cloud. يتضمّن هذا الإصدار الجديد مجموعة ميزات متقدّمة ويتوفّر الآن من خلال Cloud Run وEventarc، ما يمنحك المزيد من التحكّم المتقدم في الأداء وقابلية التوسّع، ومزيدًا من التحكّم في وقت تشغيل الوظائف والعوامل التي يتم تشغيلها من أكثر من 90 مصدر أحداث.

سيرشدك هذا الدرس التطبيقي إلى كيفية إنشاء دوال Cloud تستجيب لاستدعاءات HTTP، وتظهر من خلال رسائل Pub/Sub وسجلات تدقيق Cloud.

الميزات الجديدة

يقدّم هذا الإصدار الجديد من Cloud Functions تجربة محسّنة لخدمة FaaS بالاستناد إلى Cloud Run وCloud Build وArtifact Registry وEventarc.

البنية الأساسية المحسَّنة

  • معالجة الطلبات لفترة أطول: يمكنك تشغيل وظائف Cloud Functions لفترة أطول من المدة التلقائية التي تبلغ 5 دقائق، ما يسهّل تنفيذ أعباء العمل المرتبطة بالطلبات الأطول، مثل معالجة مصادر بيانات كبيرة من Cloud Storage أو BigQuery. بالنسبة إلى دوالّ HTTP، تصل هذه المدة إلى 60 دقيقة. بالنسبة إلى الدوالّ المستندة إلى الأحداث، يمكن أن يستغرق ذلك حاليًا ما يصل إلى 10 دقائق.
  • المثيلات الأكبر حجمًا: يمكنك الاستفادة من ذاكرة وصول عشوائي (RAM) بسعة 16 غيغابايت و4 وحدات معالجة مركزية افتراضية على وظائف السحابة الإلكترونية، ما يتيح لك الحصول على مساحة تخزين أكبر في الذاكرة وكثافة حوسبة وأعباء عمل متوازية أكثر.
  • المعالجة المتزامنة: يمكنك معالجة ما يصل إلى 1, 000 طلب متزامن باستخدام مثيل دالة واحد، ما يقلل من عمليات البدء البارد ويحسن وقت الاستجابة عند التوسيع.
  • الحد الأدنى لعدد المثيلات: يجب توفير عدد كافٍ من المثيلات التي تم إعدادها مسبقًا لتقليل عمليات التشغيل على البارد والتأكّد من أنّ وقت بدء تشغيل تطبيقك لا يؤثر في أداء التطبيق.
  • تقسيم عدد الزيارات: يمكنك إتاحة إصدارات متعددة من وظائفك وتقسيم عدد الزيارات بين الإصدارات المختلفة وإعادة وظيفتك إلى إصدار سابق.

تغطية أوسع للفعاليات ودعم Cloud Events

  • دمج Eventarc: تتضمّن Cloud Functions الآن ميزة مدمجة لخدمة Eventarc، ما يوفر أكثر من 90 مصدر حدث باستخدام سجلّات تدقيق Cloud (BigQuery وCloud SQL وCloud Storage وما إلى ذلك)، وبالطبع لا تزال Cloud Functions تتيح الأحداث من مصادر مخصّصة من خلال النشر إلى Cloud Pub/Sub مباشرةً.
  • تنسيق CloudEvent: تلتزم جميع الدوال المستندة إلى الأحداث بمعيار CloudEvents ( cloudevents.io) في المجال، بغض النظر عن المصدر، لضمان تجربة مطوّرين متّسقة. يتم إرسال الحمولات من خلال CloudEvent المنظَّم باستخدام حمولة cloudevent.data وتنفيذ معيار CloudEvent.

المُعطيات

  • نظرة عامة على Cloud Functions (الجيل الثاني)
  • كيفية كتابة دالة تستجيب لطلبات HTTP
  • كيفية كتابة دالة تستجيب لرسائل النشر/الاشتراك
  • كيفية كتابة دالة تستجيب لأحداث Cloud Storage
  • كيفية كتابة دالة تستجيب لـ "سجلّات تدقيق Cloud"
  • كيفية تقسيم عدد الزيارات بين نسختَين
  • كيفية التخلص من عمليات التشغيل على البارد باستخدام الحد الأدنى من النُسخ
  • كيفية ضبط التزامن.

2. الإعداد والمتطلبات

إعداد البيئة ذاتيًا

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديله في أي وقت.
  • يجب أن يكون معرّف المشروع فريدًا في جميع مشاريع Google Cloud وأن يكون ثابتًا (لا يمكن تغييره بعد ضبطه). تُنشئ وحدة تحكّم Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً معرفة محتواها. في معظم ورشات عمل رموز البرامج، ستحتاج إلى الإشارة إلى معرّف المشروع (يُعرَف عادةً باسم PROJECT_ID). إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف آخر عشوائي. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيظلّ ساريًا طوال مدة المشروع.
  • يُرجى العِلم أنّ هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. من المفترض ألا تتطلّب المشاركة في هذا الدليل التعليمي البرمجي أي تكلفة، أو تكلفة قليلة جدًا. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بأكمله. المستخدمون الجدد في 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- دالة 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" في 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 تم نشرها في موضوع معين.

إعداد رموز مصادقة Pub/Sub

إذا فعّلت حساب خدمة 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" في 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.

إعداد

لاستخدام وظائف 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- وظيفة سجلات تدقيق السحابة الإلكترونية

بالنسبة إلى الدالة التالية، لننشئ دالة Node.js تتلقّى حدث سجلّ تدقيق Cloud عند إنشاء مثيل لجهاز افتراضي على Compute Engine. استجابةً لذلك، تتم إضافة تصنيف إلى الجهاز الافتراضي الذي تم إنشاؤه حديثًا، مع تحديد منشئ الجهاز الافتراضي.

تحديد أجهزة Compute Engine الافتراضية التي تم إنشاؤها حديثًا

تُصدِر Compute Engine سجلَّي تدقيق عند إنشاء جهاز افتراضي.

يتمّ إصدار الرسالة الأولى في بداية إنشاء الجهاز الظاهري، وتبدو على النحو التالي:

8d394a481644c4b6.png

يتمّ بثّ الرسالة الثانية بعد إنشاء الجهاز الظاهري، وتبدو على النحو التالي:

ee0e221d82887cd1.png

لاحِظ حقل العملية الذي يتضمّن القيمتَين first: true وlast: true. يحتوي سجلّ التدقيق الثاني على كل المعلومات التي نحتاجها لتصنيف إحدى النُسخ، لذلك سنستخدم العلامة last: true لرصدها في Cloud Functions.

إعداد

لاستخدام وظائف "سجلّ تدقيق 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 كما في السابق. لاحظ كيف تصفّي الدالة سجلّات التدقيق لإدراج Compute Engine باستخدام العلامة --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.

أولاً، انتقِل إلى قسم "وظائف السحابة الإلكترونية" وأنشِئ دالة باستخدام بيئة الجيل الثاني:

8ba79a12ee152d8.png

انقر على الزر Add Eventarc Trigger:

655346320a5e3631.png

يؤدي ذلك إلى فتح لوحة جانبية على يسار الصفحة حيث يمكنك اختيار مقدّمي أحداث وأحداث مختلفة لعامل تشغيل Eventarc.

اختر موفّر الحدث المناسب والحدث المناسب، ثم انقر على Save Trigger:

7d24325ff06c9b05.png

أخيرًا، في الصفحة التالية، يمكنك تعديل ملفات index.js وpackage.json باستخدام ملفات index.js وpackage.json على GitHub والنقر على الزر Deploy:

f2e338eed2ccf5a2.png

الاختبار

لاختبار وظيفة "سجلّ التدقيق"، يجب إنشاء جهاز افتراضي في Compute Engine في Cloud Console (يمكنك أيضًا إنشاء أجهزة افتراضية باستخدام gcloud ولكن يبدو أنّه لن يتم إنشاء سجلّات التدقيق).

انتقِل إلى قسم Compute Engine > نُسخات الأجهزة الافتراضية في Cloud Console وأنشئ جهازًا افتراضيًا جديدًا. بعد اكتمال إنشاء الجهاز الظاهري، من المفترض أن يظهر لك تصنيف creator المُضاف على الجهاز الظاهري في Cloud Console ضمن قسم المعلومات الأساسية أو باستخدام الأمر التالي:

gcloud compute instances describe YOUR_VM_NAME

من المفترض أن يظهر لك التصنيف في الإخراج على النحو التالي:

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

7- تقسيم الزيارات

تتوافق Cloud Functions (الجيل الثاني) مع نُسخ متعددة من وظائفك، ما يؤدي إلى تقسيم الزيارات بين النُسخ المختلفة وإعادة وظيفتك إلى إصدار سابق. ويكون ذلك ممكنًا لأنّ وظائف الجيل الثاني هي خدمات تشغيل السحابة الإلكترونية ضمن الخيارات المتقدمة.

في هذه الخطوة، ستقوم بنشر نسختين من إحدى الدوال، ثم تقسيم حركة البيانات بينها من 50 إلى 50.

إنشاء

أنشِئ مجلدًا للتطبيق وانتقِل إليه:

mkdir ~/traffic-splitting && cd $_

أنشئ ملف main.py يتضمّن دالة Python تقرأ متغيّر بيئة اللون وتردّ بـ 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 (ناتج عنوان URL لأمر النشر أعلاه) في المتصفّح، من المفترض أن يظهر لك الرمز 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.png 391286a08ad3cdde.png

اطّلِع على عمليات التراجع والطرح التدريجي ونقل الزيارات لمزيد من المعلومات.

8. الحد الأدنى لعدد النُسخ

في Cloud Functions (الجيل الثاني)، يمكن تحديد الحد الأدنى لعدد نُسخ الدوالّ التي يجب إبقاؤها جاهزة لعرض الطلبات. وَيفيد ذلك في الحدّ من عدد عمليات التشغيل على البارد.

في هذه الخطوة، سيتم نشر دالة ذات إعداد بطيء. ستلاحظ مشكلة "التشغيل المجرّد". بعد ذلك، عليك نشر الدالة مع ضبط الحد الأدنى لقيمة المثيل على 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. المعالجة المتزامنة

في Cloud Functions (الجيل الثاني)، يعالج مثيل الدالة طلبًا واحدًا متزامنًا تلقائيًا، ولكن يمكنك تحديد عدد الطلبات المتزامنة التي يمكن معالجتها في الوقت نفسه بواسطة المثيل. ويمكن أن يكون ذلك مفيدًا أيضًا في منع عمليات البدء البارد، إذ لا يلزم إنشاء مثيل دالة جديد لكل طلب موازٍ.

في هذه الخطوة، ستستخدم الدالة مع الإعداد البطيء من الخطوة السابقة. سترسل إليه 10 طلبات وستلاحظ مشكلة بدء التشغيل البارد مرة أخرى لأنّه يجب إنشاء نُسخ جديدة من الدالة لمعالجة الطلبات.

لحلّ مشكلة بدء التشغيل البارد، عليك نشر دالة أخرى بقيمة 100 للعمليات المتزامنة. ستلاحظ أنّ الطلبات العشرة الآن لا تتسبب في مشكلة التشغيل على البارد ويمكن لمثيل دالة واحد معالجة جميع الطلبات.

الاختبار بدون تسلسل

الحصول على عنوان URL للدالة:

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

استخدِم أداة قياس أداء مفتوحة المصدر تُسمى hey لإرسال 10 طلبات متزامنة إلى الدالة البطيئة. سبق أن تم تثبيت تطبيق 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

ضبط ميزة "المعالجة المتزامنة"

اضبط تزامن خدمة تشغيل السحابة الإلكترونية الأساسية للدالة على 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. تهانينا!

تهانينا على إكمال دورة codelab.

المواضيع التي تناولناها

  • نظرة عامة على Cloud Functions (الجيل الثاني)
  • كيفية كتابة دالة تستجيب لطلبات HTTP
  • كيفية كتابة دالة تستجيب لرسائل النشر/الاشتراك
  • كيفية كتابة دالة تستجيب لأحداث Cloud Storage
  • كيفية كتابة دالة تستجيب لـ "سجلّات تدقيق Cloud"
  • كيفية تقسيم عدد الزيارات بين نسختَين
  • كيفية التخلص من عمليات التشغيل على البارد باستخدام الحد الأدنى من النُسخ
  • كيفية ضبط ميزة "المعالجة المتزامنة"