שינוי אוטומטי של גודל מאגרי העובדים על סמך נפח התור של Pub/Sub

במדריך הזה נסביר איך לפרוס מאגר עובדים של Cloud Run כדי לעבד הודעות Pub/Sub, ואיך לשנות את קנה המידה של מופעי הצרכן באופן אוטומטי על סמך עומק התור באמצעות שינוי קנה מידה אוטומטי של מדדים חיצוניים של Cloud Run‏ (CREMA).

מטרות

במדריך הזה תלמדו:

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. מפעילים את ממשקי ה-API של Cloud Run,‏ Parameter Manager,‏ Artifact Registry,‏ Pub/Sub ו-Cloud Build.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    הפעלת ממשקי ה-API

  7. מתקינים ומפעילים את ה-CLI של gcloud.
  8. עדכון רכיבים:
    gcloud components update
  9. במדריך הזה נעשה שימוש בכמה משתני סביבה. כדי לשפר את ניפוי הבאגים, מריצים את הפקודה הבאה כדי ליצור שגיאה כשמפנים למשתני סביבה מקומיים שלא הוגדרו:
    set -u
  10. מגדירים את משתני ההגדרה הבאים עבור CREMA שמשמשים במדריך הזה:
    export PROJECT_ID=PROJECT_ID
    export REGION=us-central1
    export TOPIC_ID=crema-pubsub-topic
    export SUBSCRIPTION_ID=crema-subscription
    export CREMA_SA_NAME=crema-service-account
    export CONSUMER_SA_NAME=consumer-service-account
    export CONSUMER_WORKER_POOL_NAME=worker-pool-consumer
    export CREMA_SERVICE_NAME=my-crema-service
    מחליפים את PROJECT_ID במזהה הפרויקט. Google Cloud
  11. מגדירים את מזהה הפרויקט באמצעות הפקודה הבאה:
    gcloud config set project $PROJECT_ID
  12. החיובים על שירות ההרחבה של Cloud Run מבוססים על התדירות שבה מפעילים את ההרחבה. למידע נוסף, אפשר להשתמש במחשבון התמחור כדי להעריך את העלויות.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות להשלמת המדריך, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

יצירת נושא ומינוי ב-Pub/Sub

כדי להגדיר שינוי גודל אוטומטי של העובד, יוצרים מינוי מסוג pull לאפליקציית הצרכן לפי השלבים הבאים:

  1. יוצרים נושא Pub/Sub שמייצג פיד של הודעות:

    gcloud pubsub topics create $TOPIC_ID
    
  2. יוצרים מינוי שליפה כדי לצרוך הודעות מנושא Pub/Sub:

    gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC_ID
    

יצירת חשבונות שירות בהתאמה אישית

במדריך הזה נדרשים שני חשבונות שירות עם ההרשאות המינימליות הנדרשות לשימוש במשאבים שהוקצו:

  • חשבון שירות לצרכן: זהות של מאגר העובדים של הצרכן שמטפל בהודעות. מריצים את הפקודה הבאה כדי ליצור את חשבון השירות של הצרכן:

    gcloud iam service-accounts create $CONSUMER_SA_NAME \
      --display-name="Pub/Sub consumer service account"
    
  • חשבון שירות CREMA: זהות לצורך שינוי גודל אוטומטי. מריצים את הפקודה הבאה כדי ליצור את חשבון השירות של CREMA:

    gcloud iam service-accounts create $CREMA_SA_NAME \
      --display-name="CREMA service account"
    

הענקת הרשאות נוספות לחשבונות השירות המותאמים אישית שלך

כדי לשנות את גודל מאגר העובדים, צריך להעניק את ההרשאות הבאות בחשבונות השירות המותאמים אישית:

  1. נותנים לחשבון השירות של CREMA הרשאה לקרוא מ-Parameter Manager:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/parametermanager.parameterViewer"
    
  2. נותנים לחשבון השירות של CREMA הרשאה לשנות את גודל מאגר העובדים:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/run.developer"
    
  3. נותנים לחשבון השירות של CREMA את התפקיד Service Account User:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/iam.serviceAccountUser"
    
  4. נותנים לחשבון השירות של CREMA הרשאה לצפייה במדדים:

     gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
       --role="roles/monitoring.viewer"
    
  5. נותנים לחשבון השירות של CREMA הרשאה לכתוב מדדים:

     gcloud projects add-iam-policy-binding $PROJECT_ID \
       --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
       --role="roles/monitoring.metricWriter"
    
  6. נותנים לחשבון השירות של CREMA הרשאה לצפייה בהודעות ב-Pub/Sub:

    gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \
      --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/pubsub.viewer"
    
  7. נותנים לחשבון השירות הפרטי הרשאה לשלוף הודעות מהמינוי:

    gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \
      --member="serviceAccount:$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/pubsub.subscriber"
    

פריסת מאגר עובדים של Cloud Run

כדי לפרוס מאגר עובדים שצורכים הודעות ממנויים ל-Pub/Sub, פועלים לפי השלבים הבאים:

  1. יוצרים תיקייה בשם consumer ועוברים אליה:

    mkdir consumer
    cd consumer
    
  2. יוצרים קובץ בשם worker.py ומוסיפים את הקוד הבא:

    import os
    import time
    from google.cloud import pubsub_v1
    from concurrent.futures import TimeoutError
    
    # Configuration
    PROJECT_ID = os.environ.get('PROJECT_ID')
    SUBSCRIPTION_ID = os.environ.get('SUBSCRIPTION_ID')
    
    subscription_path = f"projects/{PROJECT_ID}/subscriptions/{SUBSCRIPTION_ID}"
    
    print(f"Worker Pool instance starting. Watching {subscription_path}...")
    
    subscriber = pubsub_v1.SubscriberClient()
    
    def callback(message):
        try:
            data = message.data.decode("utf-8")
            print(f"Processing job: {data}")
            time.sleep(5)  # Simulate work
            print(f"Done {data}")
            message.ack()
        except Exception as e:
            print(f"Error processing message: {e}")
            message.nack()
    
    streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback)
    print(f"Listening for messages on {subscription_path}...")
    
    # Wrap subscriber in a 'with' block to automatically call close() when done.
    with subscriber:
        try:
            # When `timeout` is not set, result() will block indefinitely,
            # unless an exception is encountered first.
            streaming_pull_future.result()
        except TimeoutError:
            streaming_pull_future.cancel()  # Trigger the shutdown.
            streaming_pull_future.result()  # Block until the shutdown is complete.
        except Exception as e:
            print(f"Streaming pull failed: {e}")
    
  3. יוצרים קובץ Docker ומוסיפים את הקוד הבא:

    FROM python:3.12-slim
    RUN pip install google-cloud-pubsub
    COPY worker.py .
    CMD ["python", "-u", "worker.py"]
    
  4. פורסים את מאגר העובדים של הצרכן עם 0 מופעים כדי ש-CREMA יוכל להגדיל את הקיבולת:

    gcloud run worker-pools deploy $CONSUMER_WORKER_POOL_NAME \
      --source . \
      --region $REGION \
      --service-account="$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
      --instances=0 \
      --set-env-vars PROJECT_ID=$PROJECT_ID,SUBSCRIPTION_ID=$SUBSCRIPTION_ID
    

פריסת שירות CREMA של התאמה אוטומטית לעומס

אחרי שפורסים את מאגר העובדים כדי לצרוך הודעות מ-Pub/Sub, צריך להגדיר את CREMA autoscaler כדי להקצות מופעי עובדים על סמך נפח ההודעות.

הגדרת התכונה לשינוי אוטומטי של גודל הקבוצה

במדריך הזה משתמשים ב-Parameter Manager כדי לאחסן את קובץ התצורה של CREMA בפורמט YAML.

  1. יוצרים פרמטר ב-Parameter Manager כדי לאחסן גרסאות של פרמטרים עבור CREMA:

    PARAMETER_ID=crema-config
    PARAMETER_REGION=global
    gcloud parametermanager parameters create $PARAMETER_ID --location=$PARAMETER_REGION --parameter-format=YAML
    
  2. עוברים לספריית הבסיס של הפרויקט באמצעות הפקודה הבאה:

    cd
    
  3. בתיקיית השורש, יוצרים קובץ YAML‏, my-crema-config.yaml, כדי להגדיר את התצורה של קנה המידה האוטומטי:

    apiVersion: crema/v1
    kind: CremaConfig
    spec:
      pollingInterval: 30
      triggerAuthentications:
        - metadata:
            name: adc-trigger-auth
          spec:
            podIdentity:
              provider: gcp
      scaledObjects:
        - spec:
            scaleTargetRef:
              name: projects/PROJECT_ID/locations/us-central1/workerpools/worker-pool-consumer
            triggers:
              - type: gcp-pubsub
                metadata:
                  subscriptionName: "crema-subscription"
                  # Target number of undelivered messages per worker instance
                  value: "10"
                  mode: "SubscriptionSize"
                authenticationRef:
                  name: adc-trigger-auth
    

    מחליפים את PROJECT_ID במזהה הפרויקט. Google Cloud

  4. מעלים את קובץ ה-YAML המקומי כגרסה חדשה של פרמטר:

    LOCAL_YAML_CONFIG_FILE=my-crema-config.yaml
    PARAMETER_VERSION=1
    
    gcloud parametermanager parameters versions create $PARAMETER_VERSION \
      --location=$PARAMETER_REGION \
      --parameter=$PARAMETER_ID \
      --payload-data-from-file=$LOCAL_YAML_CONFIG_FILE
    
  5. מריצים את הפקודה הבאה כדי לוודא שהוספת הפרמטר הצליחה:

    gcloud parametermanager parameters versions list \
    --parameter=$PARAMETER_ID \
    --location=$PARAMETER_REGION
    

    אמור להופיע נתיב הפרמטר, כמו projects/PROJECT_ID/locations/global/parameters/crema-config/versions/1.

פריסת השירות כדי להרחיב את עומסי העבודה

כדי לפרוס את השירות כדי להרחיב את מאגר העובדים, מריצים את הפקודה הבאה עם קובץ אימג' של קונטיינר שנבנה מראש:

CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0

gcloud run deploy $CREMA_SERVICE_NAME \
  --image=${IMAGE} \
  --region=${REGION} \
  --service-account="${CREMA_SA_NAME}" \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --base-image=us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/java25 \
  --labels=created-by=crema \
  --set-env-vars="CREMA_CONFIG=${CREMA_CONFIG_PARAM_VERSION},OUTPUT_SCALER_METRICS=True"

בדיקת שירות ההתאמה האוטומטית לעומס

כדי לבדוק את שירות CREMA, יוצרים סקריפט שמפיק 100 הודעות ושולח אותן לתור Pub/Sub:

  1. בתיקיית השורש, יוצרים קובץ בשם load-pubsub.sh ומוסיפים את הקוד הבא:

    #!/bin/bash
    
    TOPIC_ID=${TOPIC_ID}
    PROJECT_ID=${PROJECT_ID}
    NUM_MESSAGES=100
    
    echo "Publishing $NUM_MESSAGES messages to topic $TOPIC_ID..."
    
    for i in $(seq 1 $NUM_MESSAGES); do
      gcloud pubsub topics publish $TOPIC_ID --message="job-$i" --project=$PROJECT_ID &
      if (( $i % 10 == 0 )); then
        wait
        echo "Published $i messages..."
      fi
    done
    wait
    echo "Done. All messages published."
    
  2. מריצים את בדיקת העומס:

    chmod +x load-pubsub.sh
    ./load-pubsub.sh
    

הפקודה הזו יוצרת 100 הודעות ושולחת אותן למינוי Pub/Sub.

שינוי גודל הצג

אחרי שהסקריפט load-pubsub.sh מסתיים, מחכים שלוש עד ארבע דקות לפני שבודקים את היומנים של השירות, my-crema-service. שירות ה-autoscaler של CREMA מגדיל את מספר המופעים של העובדים הצרכניים מ-0.

אלה היומנים שיוצגו:

כל הודעה ביומן מסומנת בתווית של הרכיב שיצר אותה.

[INFO] [METRIC-PROVIDER] Starting metric collection cycle
[INFO] [METRIC-PROVIDER] Successfully fetched scaled object metrics ...
[INFO] [METRIC-PROVIDER] Sending scale request ...
[INFO] [SCALER] Received ScaleRequest ...
[INFO] [SCALER] Current instances ...
[INFO] [SCALER] Recommended instances ...

לחלופין, מריצים את הפקודה הבאה כדי לוודא ששירות CREMA ממליץ על מכונות וירטואליות על סמך עומק התור:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$CREMA_SERVICE_NAME AND textPayload:SCALER" \
  --limit=20 \
  --format="value(textPayload)" \
  --freshness=5m

כדי לראות את יומני הצרכנים שצורכים הודעות, מריצים את הפקודה הבאה:

gcloud run worker-pools logs tail $CONSUMER_WORKER_POOL_NAME --region=$REGION

אמורים להופיע יומנים בפורמט Done job-100.

הסרת המשאבים

כדי להימנע מחיובים נוספים בחשבון Google Cloud , מוחקים את כל המשאבים שהצבתם באמצעות המדריך הזה.

מחיקת הפרויקט

אם יצרתם פרויקט חדש בשביל המדריך הזה, מוחקים את הפרויקט. אם השתמשתם בפרויקט קיים ואתם רוצים לשמור אותו בלי השינויים שהוספתם במדריך הזה, תצטרכו למחוק את המשאבים שיצרתם לצורך המדריך.

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת משאבי הדרכה

  1. מוחקים את שירות Cloud Run שפרסתם במדריך הזה. שירותי Cloud Run לא צוברים עלויות עד שהם מקבלים בקשות.

    כדי למחוק את שירות Cloud Run, מריצים את הפקודה הבאה:

    gcloud run services delete SERVICE-NAME

    מחליפים את SERVICE-NAME בשם השירות.

    אפשר גם למחוק שירותים של Cloud Run מGoogle Cloud המסוף.

  2. מסירים את הגדרת ברירת המחדל של האזור gcloud שהוספתם במהלך ההגדרה של המדריך:

     gcloud config unset run/region
    
  3. מסירים את הגדרות הפרויקט:

     gcloud config unset project
    
  4. מוחקים את משאבי Pub/Sub:

    gcloud pubsub subscriptions delete $SUBSCRIPTION_ID
    gcloud pubsub topics delete $TOPIC_ID
    
  5. מחיקת משאבים אחרים Google Cloud שנוצרו במדריך הזה:

המאמרים הבאים