تشغيل مهام تشغيل السحابة الإلكترونية باستخدام أداة جدولة المهام في السحابة الإلكترونية

1. نظرة عامة

في هذا الدرس التطبيقي، ستنشئ وظيفة Cloud Run وتُعدّ وظيفتَي Cloud Scheduler. سيتم تفعيل خدمة Cymbal Eats Menu Service باستخدام النص البرمجي للإعداد. ستقوم بإنشاء مهمة تشغيل في السحابة الإلكترونية تقوم بإجراء استدعاءات واجهة برمجة التطبيقات إلى Cymbal Eats Menu Service. ستقوم بتنفيذ المهمة باستخدام واجهة سطر الأوامر في Google Cloud وإعداد جدول زمني للمهمة. ستتحقق من التنفيذ من خلال مراجعة السجلات وإجراء طلبات البيانات من واجهة برمجة التطبيقات في "خدمة القائمة" للتأكد من حذف عناصر القائمة.

ما هي وظائف Cloud Run؟

تشغِّل مهمة تشغيل السحابة الإلكترونية حاوية لا توفّر طلبات الويب ولكنها تنفِّذ مهام تشغيلية أو معالجة بيانات بدلاً من ذلك. ستشغِّل الحاوية المهمة وستخرج عند الانتهاء.

مهمة خدمة تنظيف

ستسترد مهمة خدمة تنظيف البيانات عناصر القائمة بالحالة "تعذّر الإجراء" وتحذفها. عند إنشاء عناصر جديدة في القائمة، يتم تحليل الصور باستخدام واجهة Vision API لمعرفة ما إذا كانت صنفًا طعامًا أم لا. بالنسبة إلى الصور التي لا تجتاز عملية التحقّق هذه، سيتم تعديل حالة عناصر القائمة إلى "تعذّر الإجراء"، وسيتم حذفها لاحقًا من خلال وظيفة التنظيف.

d74200f0bd14d350.png

ما ستتعرّف عليه

ستتعلم في هذا التمرين المعملي كيفية القيام بما يلي:

  • إنشاء مهام Cloud Run
  • تنفيذ مهام Cloud Run
  • إنشاء مهام Cloud Scheduler
  • التحقّق من تنفيذ المهام

المتطلبات الأساسية

  • يفترض هذا التمرين المعملي الإلمام ببيئتي Cloud Console وطبقة الغلاف.
  • تُعدّ التجربة السابقة لاستخدام Cloud Run وCloud Scheduler مفيدة، ولكنها ليست مطلوبة.

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

إعداد مشروع Cloud

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

إعداد البيئة

يمكنك تفعيل Cloud Shell من خلال النقر على الرمز على يسار شريط البحث.

eb0157a992f16fa3.png

من Cloud Shell، شغِّل الأمر التالي لاستنساخ رمز التطبيق من هذا المستودع وانتقِل إلى الدليل الذي يحتوي على خدمة القائمة:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

انشر خدمة القائمة باستخدام النص البرمجي للإعداد في "التشغيل في السحابة الإلكترونية". خدمة القائمة هي خدمة مصغّرة مستندة إلى لغة Java تم إنشاؤها من خلال إطار عمل Quarkus باستخدام قاعدة بيانات Cloud SQL Postgres لخلفيةها. خدمة Menu هي إحدى التبعيات أثناء التشغيل لوظيفتك على Cloud Run التي ستنشئها في الخطوات التالية.

./setup.sh

ستستغرق عملية النشر حوالي 10 دقائق لإنشاء جميع المكونات المطلوبة.

اتّبِع الخطوات التالية بعد تنفيذ الأمر أعلاه.

3- استكشاف رمز وظيفة Cloud Run

افتح علامة تبويب جديدة في Cloud Shell من خلال النقر على رمز علامة الجمع.

45f480cd1b9a995.png

انتقل إلى الدليل الذي يحتوي على خدمة التنظيف وراجع الملفات التي تشكل المهمة:

cd ~/cymbal-eats/cleanup-service

تتضمّن خدمة تنظيف البيانات في هذا الدليل Dockerfile الذي يحدّد صورة الحاوية لمهمة خدمة الإزالة باستخدام التبعيات المطلوبة(httpie, jq).

Dockerfile

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

يحتوي النص البرمجي للتنظيف الفعلي، المدرج أدناه، على أوامر للحصول على قائمة بعناصر القائمة في حالة "تعذّر الإجراء" وحذفها من خلال إجراء طلبات بيانات من واجهة برمجة التطبيقات إلى خدمة القائمة.

script.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

لاحظ ما يلي حول النص البرمجي:

  • سيتم ضبط متغيّرات البيئة FAILED_ITEM_AGE وMENU_SERVICE_URL أثناء النشر وسيتم تمريره من خلال مهمة تشغيل السحابة الإلكترونية.
  • FAILED_ITEM_AGE - سيتم حذف عدد الدقائق قبل حذف العنصر الذي تعذَّر إتمامه.
  • MENU_SERVICE_URL - عنوان URL لخدمة Cymbal Eats Menu

4. إنشاء مهمة تشغيل السحابة الإلكترونية

بعد ذلك، ستقوم بإنشاء صورة حاوية ونشرها على Artifact Registry.

سيتم استخدام صورة الحاوية هذه لإنشاء مهمة تشغيل السحابة الإلكترونية.

تفعيل واجهات برمجة تطبيقات الخدمات:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

ضبط متغيرات البيئة:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

أنشئ مستودعًا جديدًا لـ Artifact Registry لتخزين صور Docker لمهمة التنظيف:

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

أنشِئ صورة الحاوية باستخدام Cloud Build وانشرها في Artifact Registry باستخدام أمر واحد:

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

مثال على الإخراج:

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

بعد الانتهاء من النشر، انتقِل إلى Artifact Registry وراجِع الصورة المنشورة:

fb95ae38baa7c543.png

بدِّل إلى علامة تبويب Cloud Shell الثانية. شغِّل الأمر التالي لوصف خدمة القائمة وحفظ عنوان URL في متغير البيئة. سيتم استخدام متغيّر البيئة هذا لضبط مهمة تشغيل السحابة الإلكترونية.

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

يمكنك إنشاء مهمة "تشغيل السحابة الإلكترونية" لإزالة عناصر القائمة التي تعذّر تنفيذها والتي مرّ عليها أكثر من دقيقة واحدة [الضبط من قِبل "FAILED_ITEM_AGE]".

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

مثال على الإخراج:

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

انتقِل إلى قسم JOBS في Cloud Run في وحدة التحكّم وراجِع المهمة التي تم إنشاؤها.

انقر على الوظيفة واستكشِف علامات التبويب المتاحة: "السجلّ" و"السجلات" و"الضبط" و"YAML".

b12c8e312de3b66.png

تأكَّد من أنّه تم ضبط متغيرات البيئة من خلال مراجعة قسم الضبط للمهمة في وحدة التحكّم:

724c2919d05349c8.png

(اختياري) إذا كنت تريد تغيير متغيّرات عمر العنصر الذي تعذّر إرساله أو عنوان URL لخدمة القائمة، يمكنك استخدام الأمر "تحديث" بعد إنشاء مهمة Cloud Run:

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

للتحقّق من صحة المهمة، يمكنك تنفيذ مهمة Cloud Run من خلال تنفيذ الأمر التالي:

gcloud beta run jobs execute cleanup-service --region=$REGION

مثال على الإخراج:

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

عليك التبديل إلى علامة التبويب "السجلات" لمراجعة نتائج المهمة. من المفترض أن يظهر لك عمر العنصر الذي أخفق وعنوان URL لخدمة القائمة في السجلات.

518cb00036a2561f.png

5- إعداد جدول زمني لمهمة تشغيل السحابة الإلكترونية

Cloud Scheduler هو نظام جدولة مهام لإدارة مهام cron مُدار بالكامل على مستوى المؤسسة. ويتيح لك جدولة أي مهمة تقريبًا، بما في ذلك مهام الدُفعات والبيانات الضخمة وعمليات البنية الأساسية للسحابة الإلكترونية وغير ذلك.

تتمثل إحدى أفضل ممارسات الأمان عند العمل مع مهمة أداة Cloud Scheduler في تنفيذ كل مهمة ببيانات اعتماد منفصلة. في هذه الخطوة، أنشئ حساب خدمة لاستخدامه في وظيفة جدولة التنظيف.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

ستحتاج وظيفة Cloud Scheduler إلى أذونات لإجراء مكالمات إلى وظائف Cloud Run.

امنح الدور Cloud Run Invoker لحساب الخدمة المستخدَم في مهمة Cloud Scheduler:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

بعد ذلك، عليك إعداد جدول زمني لتشغيل وظيفة خدمة التنظيف.

هناك أنواع استهداف متعددة متوافقة مع Cloud Scheduler.

  • HTTP
  • نشر/اشتراك
  • App Engine HTTP

ستُنشئ وظيفة جدولة باستخدام نوع استهداف HTTP.

لأغراض التوضيح، ستحدد موعدًا للعرض كل 5 دقائق.

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

راجِع مَعلمة uri المستخدَمة لطلب مهمة تشغيل السحابة الإلكترونية:

  • REGION وPROJECT_ID: منطقتَا Cloud Run ورقم تعريف المشروع اللذان تم نشر وظيفة خدمة التنظيف فيهما
  • cleanup-service - اسم مهمة Cloud Run

انتقِل إلى Cloud Scheduler في وحدة التحكّم لمراجعة مهمة أداة جدولة المهام التي تم إنشاؤها:

3bc9120df7fc6ed.png

راجِع الخيارات المتاحة ضمن قائمة "الإجراءات".

7945908025dd2f2b.png

6- اختبار مهمة تشغيل السحابة الإلكترونية

باستخدام نقاط نهاية "خدمة القائمة"، راجِع عناصر القائمة الحالية وحالتها:

curl ${MENU_SERVICE_URL}/menu | jq

إخراج:

ستظهر لك 3 أصناف في القائمة بالحالة "Ready".

تغيير حالة العنصر رقم 1 في القائمة إلى Failed:

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

يُرجى الانتظار لمدة دقيقة واحدة. لكي يتم حذف عنصر القائمة، يجب أن يكون قد مرّت دقيقة واحدة على إنشائه، كما تم ضبطه بواسطة المَعلمة FAILED_ITEM_AGE.

يمكنك انتظار عملية التنفيذ المُجدوَلة التالية أو فرض تنفيذ المهمة من وحدة التحكّم.

هناك عدة طرق لبدء مهمة، من خلال واجهة المستخدم أو من سطر الأوامر.

في هذا المثال، نفِّذ الأمر في Cloud Shell(الخيار #3) لتشغيل المهمة.

  1. من Cloud Scheduler، اختَر "فرض تشغيل وظيفة" من قائمة الإجراءات.

6c8cbeae6165ba4a.png

  1. من مهمة تشغيل السحابة الإلكترونية بالنقر على زر "تنفيذ" .

229c22288882b5c3.png

  1. من Cloud Shell عن طريق تشغيل الأمر التالي:
gcloud beta run jobs execute cleanup-service --region=$REGION

انتقِل إلى قسم Cloud Run JOBS، ثم افتح علامة التبويب LOGS وتأكَّد من حذف عنصر القائمة.

50829ae27b135b2d.png

فلترة سجلّات "الحذف" للعثور على السجلات.

d94fb9e444b1c1b8.png

استخدِم نقاط نهاية "خدمة القائمة" للتحقّق من عناصر القائمة الحالية من خلال نقطة نهاية REST.

curl ${MENU_SERVICE_URL}/menu | jq

إخراج:

سيظهر لك عنصران في القائمة بالحالة "Ready".

7. تهانينا!

تهانينا، لقد أنهيت الدرس التطبيقي حول الترميز.

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

  • كيفية إنشاء مهام Cloud Run
  • كيفية تنفيذ مهام Cloud Run
  • كيفية إنشاء مهام Cloud Scheduler
  • كيفية التحقّق من تنفيذ المهام

الخطوة التالية:

استكشاف الدروس التطبيقية الأخرى حول ترميز Cymbal Eats:

تَنظيم

لتجنُّب تحمُّل الرسوم المفروضة على حسابك على Google Cloud مقابل الموارد المُستخدَمة في هذا الدليل التوجيهي، يمكنك إما حذف المشروع الذي يحتوي على الموارد أو الاحتفاظ بالمشروع وحذف الموارد الفردية.

حذف المشروع

إنّ أسهل طريقة لإيقاف الفوترة هي حذف المشروع الذي أنشأته للدليل التعليمي.