بدء استخدام 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 وحدات معالجة مركزية افتراضية في Cloud Functions، ما يتيح زيادة حجم العمل المُنشئ في الذاكرة والمكثّف من حيث الحوسبة وزيادة عدد عمليات التشغيل المتوازي.
  • المعالجة المتزامنة: يمكنك معالجة ما يصل إلى 1, 000 طلب متزامن باستخدام مثيل دالة واحد، ما يقلل من عمليات البدء البارد ويحسن وقت الاستجابة عند التوسيع.
  • الحد الأدنى لعدد المثيلات: يجب توفير عدد كافٍ من المثيلات التي تم إعدادها مسبقًا لخفض عمليات التشغيل على البارد والتأكّد من أنّ وقت بدء تشغيل تطبيقك لا يؤثر في أداء التطبيق.
  • تقسيم عدد الزيارات: يمكنك إتاحة إصدارات متعددة من وظائفك وتقسيم عدد الزيارات بين الإصدارات المختلفة وإعادة وظيفتك إلى إصدار سابق.

تغطية أوسع للأحداث ودعم CloudEvents

  • دمج 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
  • كيفية كتابة دالة تستجيب لرسائل Pub/Sub
  • كيفية كتابة دالة تستجيب لأحداث 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

بالنسبة إلى الدالة الثانية، لننشئ دالة Python يتم تفعيلها من خلال رسالة 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- وظيفة "سجلّات تدقيق Cloud"

بالنسبة إلى الدالة التالية، لننشئ دالة 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 (الجيل الثاني) مع نُسخ متعددة من وظائفك، ما يؤدي إلى تقسيم الزيارات بين النُسخ المختلفة وإعادة وظيفتك إلى إصدار سابق. ويعود السبب في ذلك إلى أنّ وظائف الجيل الثاني هي خدمات Cloud Run في الأساس.

في هذه الخطوة، ستنشر نسختَين من دالة، ثم تقسم الزيارات بينهما بنسبة 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

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

اضبط عدد عمليات التشغيل المتزامنة لخدمة 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. تهانينا!

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

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

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