مقدمة عن التنسيق بدون خادم باستخدام Workflows

مقدمة عن عملية التنسيق بدون خادم باستخدام "مهام سير العمل"

لمحة عن هذا الدرس التطبيقي حول الترميز

subjectتاريخ التعديل الأخير: مارس 19, 2025
account_circleتأليف: atamel

1. مقدمة

c9b0cc839df0bb8f.png

يمكنك استخدام عمليات سير العمل لإنشاء عمليات سير عمل بدون خادم تربط سلسلة من المهام بدون خادم معًا بترتيب تحدّده. يمكنك الجمع بين فعالية واجهات برمجة تطبيقات Google Cloud والمنتجات التي لا تستخدِم خادمًا، مثل Cloud Functions وCloud Run، وطلبات البيانات من واجهات برمجة التطبيقات الخارجية لإنشاء تطبيقات مرنة لا تستخدِم خادمًا.

لا تتطلّب عمليات سير العمل إدارة البنية الأساسية، ويمكن توسيع نطاقها بسلاسة وفقًا للطلب، بما في ذلك تصغيرها إلى الصفر. وبفضل نموذج الدفع مقابل الاستخدام، لا تدفع سوى مقابل وقت التنفيذ.

في هذا الدليل التعليمي حول رموز البرامج، ستتعرّف على كيفية ربط خدمات Google Cloud المختلفة وواجهات برمجة تطبيقات HTTP الخارجية بـ "عمليات سير العمل". وعلى وجه التحديد، ستربط خدمتَين علنيتَين من Cloud Functions وخدمة خاصة واحدة من Cloud Run وواجهة برمجة تطبيقات علنية خارجية لبروتوكول HTTP في سير عمل.

المُعطيات

  • أساسيات مهام سير العمل
  • كيفية ربط دوال Cloud Functions العامة بعمليات سير العمل
  • كيفية ربط خدمات Cloud Run الخاصة بسير العمل
  • كيفية ربط واجهات برمجة التطبيقات HTTP الخارجية بمهام سير العمل

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

إعداد البيئة حسب السرعة التي تناسبك

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

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

تذكَّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون متاحًا لك). وسيتم الإشارة إليه لاحقًا في هذا الدليل باسم PROJECT_ID.

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

من المفترض ألا تتطلّب المشاركة في هذا الدليل التعليمي البرمجي أي تكلفة، أو أن تكون التكلفة منخفضة جدًا. احرص على اتّباع أي تعليمات في قسم "التنظيف" التي تنصحك بكيفية إيقاف الموارد حتى لا يتم تحصيل رسوم منك بعد انتهاء هذا البرنامج التعليمي. المستخدمون الجدد في Google Cloud مؤهّلون للاستفادة من برنامج الفترة التجريبية المجانية التي تقدّم رصيدًا بقيمة 300 دولار أمريكي.

بدء Cloud Shell

على الرغم من أنّه يمكن تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدليل التعليمي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

من المفترض ألا يستغرق توفير البيئة والاتصال بها سوى بضع دقائق. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. ويقدّم هذا الدليل دليلاً منزليًا دائمًا بسعة 5 غيغابايت، ويتم تشغيله على Google Cloud، ما يُحسِّن بشكل كبير أداء الشبكة والمصادقة. يمكنك تنفيذ جميع أعمالك في هذا البرنامج باستخدام متصفّح فقط.

3. نظرة عامة على مهام سير العمل

الأساسيات

يتألف سير العمل من سلسلة من الخطوات الموضّحة باستخدام البنية المستندة إلى YAML في "سير العمل". هذا هو تعريف سير العمل. للحصول على شرح مفصّل لبنية YAML الخاصة بالإجراءات، يُرجى الاطّلاع على صفحة مرجع البنية.

عند إنشاء سير عمل، يتم نشره، ما يجعله جاهزًا للتنفيذ. التنفيذ هو عملية تشغيل واحدة للمنطق الوارد في تعريف سير العمل. تكون جميع عمليات تنفيذ سير العمل مستقلة، ويتوافق المنتج مع عدد كبير من عمليات التنفيذ المتزامنة.

تفعيل الخدمات

في هذا الدليل التعليمي حول الرموز البرمجية، ستربط خدمات Cloud Functions وCloud Run بـ Workflows. ستستخدم أيضًا Cloud Build وCloud Storage أثناء إنشاء الخدمات.

فعِّل جميع الخدمات اللازمة:

gcloud services enable \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  workflows.googleapis.com \
  cloudbuild.googleapis.com \
  storage.googleapis.com

في الخطوة التالية، ستربط وظيفتَي Cloud Functions معًا في سير عمل.

4. نشر أول دالة في Cloud

الدالة الأولى هي أداة إنشاء أرقام عشوائية في لغة Python.

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

mkdir ~/randomgen
cd ~/randomgen

أنشئ ملف main.py في الدليل يتضمّن المحتوى التالي:

import random, json
from flask import jsonify

def randomgen(request):
    randomNum = random.randint(1,100)
    output = {"random":randomNum}
    return jsonify(output)

عند تلقّي طلب HTTP، تنشئ هذه الدالة رقمًا عشوائيًا بين 1 و100 وتُعيده بتنسيق JSON إلى المُتصل.

تعتمد الدالة على Flask لمعالجة HTTP، ويجب إضافتها كعنصر تابع. تتم إدارة التبعيات في Python باستخدام pip ويتم التعبير عنها في ملف بيانات وصفية يُسمى requirements.txt.

أنشئ ملف requirements.txt في الدليل نفسه يتضمّن المحتوى التالي:

flask>=1.0.2

يمكنك نشر الدالة باستخدام عامل تشغيل HTTP وطلبات غير مُعتمَدة مسموح بها باستخدام هذا الأمر:

gcloud functions deploy randomgen \
    --runtime python312 \
    --trigger-http \
    --allow-unauthenticated

بعد نشر الدالة، يمكنك الاطّلاع على عنوان URL للدالة ضمن الموقع الإلكتروني url المعروض في وحدة التحكّم أو المعروض باستخدام الأمر gcloud functions describe.

يمكنك أيضًا الانتقال إلى عنوان URL الخاص بالدالة باستخدام الأمر curl التالي:

curl $(gcloud functions describe randomgen --format='value(url)')

الدالة جاهزة لاستخدامها في سير العمل.

5. نشر دالة Cloud Function الثانية

الدالة الثانية هي مُضاعِف. تُضاعِف هذه الدالة الإدخال المستلَم مرّتين.

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

mkdir ~/multiply
cd ~/multiply

أنشئ ملف main.py في الدليل يتضمّن المحتوى التالي:

import random, json
from flask import jsonify

def multiply(request):
    request_json = request.get_json()
    output = {"multiplied":2*request_json['input']}
    return jsonify(output)

عند تلقّي طلب HTTP، تستخرج هذه الدالة القيمة input من نص JSON وتضربها في 2 وتعيدها بتنسيق JSON إلى المُرسِل.

أنشئ ملف requirements.txt نفسه في الدليل نفسه باستخدام المحتوى التالي:

flask>=1.0.2

يمكنك نشر الدالة باستخدام عامل تشغيل HTTP وطلبات غير مُعتمَدة مسموح بها باستخدام هذا الأمر:

gcloud functions deploy multiply \
    --runtime python312 \
    --trigger-http \
    --allow-unauthenticated

بعد نشر الدالة، يمكنك أيضًا الانتقال إلى عنوان URL الخاص بالدالة باستخدام الأمر curl التالي:

curl $(gcloud functions describe multiply --format='value(url)') \
-X POST \
-H "content-type: application/json" \
-d '{"input": 5}'

الدالة جاهزة لاستخدامها في سير العمل.

6. ربط وظيفتَي Cloud

في سير العمل الأول، اربط الدالتَين معًا.

أنشئ ملف workflow.yaml يتضمّن المحتوى التالي.

- randomgenFunction:
    call: http.get
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/randomgen
    result: randomgenResult
- multiplyFunction:
    call: http.post
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/multiply
        body:
            input: ${randomgenResult.body.random}
    result: multiplyResult
- returnResult:
    return: ${multiplyResult}

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

يمكنك نشر سير العمل الأول باتّباع الخطوات التالية:

gcloud workflows deploy workflow --source=workflow.yaml

تنفيذ سير العمل الأول:

gcloud workflows execute workflow

بعد تنفيذ سير العمل، يمكنك الاطّلاع على النتيجة من خلال إدخال معرّف التنفيذ الوارد في الخطوة السابقة:

gcloud workflows executions describe <your-execution-id> --workflow workflow

سيتضمّن الناتج result وstate:

result: '{"body":{"multiplied":108},"code":200 ... } 

...
state: SUCCEEDED

7. ربط واجهة برمجة تطبيقات HTTP خارجية

بعد ذلك، عليك ربط math.js كخدمة خارجية في سير العمل.

في math.js، يمكنك تقييم التعبيرات الحسابية على النحو التالي:

curl https://api.mathjs.org/v4/?'expr=log(56)'

هذه المرة، ستستخدم Cloud Console لتعديل سير العمل. ابحث عن Workflows في Google Cloud Console:

7608a7991b33bbb0.png

ابحث عن سير العمل وانقر على علامة التبويب Definition:

f3c8c4d3ffa49b1b.png

عدِّل تعريف سير العمل وأدرِج طلبًا إلى math.js.

- randomgenFunction:
    call: http.get
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/randomgen
    result: randomgenResult
- multiplyFunction:
    call: http.post
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/multiply
        body:
            input: ${randomgenResult.body.random}
    result: multiplyResult
- logFunction:
    call: http.get
    args:
        url: https://api.mathjs.org/v4/
        query:
            expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"}
    result: logResult
- returnResult:
    return: ${logResult}

يُغذّي سير العمل الآن ناتج دالة الضرب في طلب دالة السجلّ في math.js.

سترشدك واجهة المستخدم إلى تعديل سير العمل ونشره. بعد نشر سير العمل، انقر على Execute لتنفيذه. ستظهر لك تفاصيل التنفيذ:

b40c76ee43a1ce65.png

لاحظ رمز الحالة 200 وbody مع ناتج دالة log.

لقد دمجت للتو خدمة خارجية في سير العمل، رائعة.

8. نشر خدمة Cloud Run

في الجزء الأخير، يمكنك إنهاء سير العمل من خلال طلب إلى خدمة Cloud Run خاصة. وهذا يعني أنّه يجب مصادقة سير العمل للاتّصال بخدمة Cloud Run.

تعرِض خدمة Cloud Run math.floor للرقم الذي تم تمريره.

أنشئ دليلاً لرمز الخدمة وانتقِل إليه:

mkdir ~/floor
cd ~/floor

أنشئ ملف app.py في الدليل يتضمّن المحتوى التالي:

import json
import logging
import os
import math

from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['POST'])
def handle_post():
    content = json.loads(request.data)
    input = float(content['input'])
    return f"{math.floor(input)}", 200

if __name__ != '__main__':
    # Redirect Flask logs to Gunicorn logs
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers = gunicorn_logger.handlers
    app.logger.setLevel(gunicorn_logger.level)
    app.logger.info('Service started...')
else:
    app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

تُنشئ خدمة Cloud Run حاويات، لذا تحتاج إلى Dockerfile ويجب ربط الحاوية بمتغيرَي البيئة 0.0.0.0 وPORT، وبالتالي الرمز أعلاه.

عند تلقّي طلب HTTP، تستخرج هذه الدالة العنصر input من نص JSON، وتستدعي دالة math.floor وتُعيد النتيجة إلى المُتصل.

في الدليل نفسه، أنشئ Dockerfile التالي:

# Use an official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.7-slim

# Install production dependencies.
RUN pip install Flask gunicorn

# Copy local code to the container image.
WORKDIR /app
COPY . .

# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app

أنشئ الحاوية:

export SERVICE_NAME=floor
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

بعد إنشاء الحاوية، يمكنك نشرها على Cloud Run. لاحِظ علامة no-allow-unauthenticated. يضمن ذلك قبول الخدمة للمكالمات التي تمّت مصادقتها فقط:

gcloud run deploy ${SERVICE_NAME} \
  --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
  --platform managed \
  --no-allow-unauthenticated

بعد نشر الخدمة، تصبح جاهزة لاستخدامها في سير العمل.

9. ربط خدمة Cloud Run

قبل أن تتمكّن من ضبط Workflows للاتّصال بخدمة Cloud Run الخاصة، عليك إنشاء حساب خدمة لاستخدامه في Workflows:

export SERVICE_ACCOUNT=workflows-sa
gcloud iam service-accounts create ${SERVICE_ACCOUNT}

امنح دور run.invoker لحساب الخدمة. سيسمح ذلك لحساب الخدمة بالاتصال بخدمات Cloud Run التي تمّت مصادقتها:

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

عدِّل تعريف سير العمل في workflow.yaml لتضمين خدمة Cloud Run. يُرجى ملاحظة أنّك تضمّن أيضًا الحقل auth للتأكّد من أنّ Workflows تُرسل رمز المصادقة في طلبات الاتصال بخدمة Cloud Run:

- randomgenFunction:
    call: http.get
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/randomgen
    result: randomgenResult
- multiplyFunction:
    call: http.post
    args:
        url: https://<region>-<project-id>.cloudfunctions.net/multiply
        body:
            input: ${randomgenResult.body.random}
    result: multiplyResult
- logFunction:
    call: http.get
    args:
        url: https://api.mathjs.org/v4/
        query:
            expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"}
    result: logResult
- floorFunction:
    call: http.post
    args:
        url: https://floor-<random-hash>.run.app
        auth:
            type: OIDC
        body:
            input: ${logResult.body}
    result: floorResult
- returnResult:
    return: ${floorResult}

عدِّل سير العمل. هذه الفترة الزمنية التي تمر في حساب الخدمة:

gcloud workflows deploy workflow \
    --source=workflow.yaml \
    --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

تنفيذ سير العمل:

gcloud workflows execute workflow

بعد بضع ثوانٍ، يمكنك الاطّلاع على تنفيذ سير العمل لمعرفة النتيجة:

gcloud workflows executions describe <your-execution-id> --workflow workflow

سيتضمّن الإخراج عددًا صحيحًا result وstate:

result: '{"body":"5","code":200 ... } 

...
state: SUCCEEDED

10. تهانينا!

تهانينا على إكمال ورشة رموز البرامج.

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

  • أساسيات مهام سير العمل
  • كيفية ربط دوال Cloud Functions العامة بعمليات سير العمل
  • كيفية ربط خدمات Cloud Run الخاصة بسير العمل
  • كيفية ربط واجهات برمجة تطبيقات HTTP الخارجية بمهام سير العمل