CREMA ব্যবহার করে পাব/সাব কিউ ভলিউমের উপর ভিত্তি করে অটোস্কেল ক্লাউড রান কর্মী পুল

1. ভূমিকা

সংক্ষিপ্ত বিবরণ

এই টিউটোরিয়ালটি আপনাকে দেখাবে কিভাবে Pub/Sub বার্তাগুলি প্রক্রিয়া করার জন্য একটি Cloud Run কর্মী পুল (ভোক্তা) স্থাপন করতে হয় এবং Cloud Run External Metrics Autoscaling (CREMA) ব্যবহার করে সারির গভীরতার উপর ভিত্তি করে আপনার গ্রাহক দৃষ্টান্তগুলিকে স্বয়ংক্রিয়ভাবে স্কেল করতে হয়।

তুমি কি শিখবে

এই কোডল্যাবে, আপনি যা করবেন:

  • একটি পাব/সাব বিষয় এবং সাবস্ক্রিপশন তৈরি করুন এবং সেই বিষয়ে বার্তা পাঠান।
  • একটি ক্লাউড রান কর্মী পুল (ভোক্তা) স্থাপন করুন যা পাব/সাব থেকে বার্তা গ্রহণ করে।
  • পাব/সাব সাবস্ক্রিপশনে থাকা বার্তার সংখ্যার উপর ভিত্তি করে আপনার কর্মী পুলকে স্বয়ংক্রিয়ভাবে স্কেল করার জন্য GitHub-এ CREMA প্রকল্পটিকে ক্লাউড রান পরিষেবা হিসেবে স্থাপন করুন।
  • স্থানীয়ভাবে একটি পাইথন স্ক্রিপ্ট চালিয়ে লোড তৈরি করে আপনার অটোস্কেলিং কনফিগারেশন পরীক্ষা করুন।

2. পরিবেশ ভেরিয়েবল কনফিগার করুন

যেহেতু এই কোডল্যাব জুড়ে অনেক পরিবেশগত ভেরিয়েবল ব্যবহার করা হয়েছে, আমরা চালানোর পরামর্শ দিচ্ছি

set -u

যা আপনাকে সতর্ক করবে যদি আপনি এমন একটি env var ব্যবহার করার চেষ্টা করেন যা এখনও সেট করা হয়নি। এই সেটিংটি পূর্বাবস্থায় ফেরাতে, set +u চালান

প্রথমে, নিম্নলিখিত ভেরিয়েবলটি আপনার প্রজেক্ট আইডিতে পরিবর্তন করুন।

export PROJECT_ID=<YOUR_PROJECT_ID>

এবং তারপর এটিকে এই কোডল্যাবের জন্য প্রকল্প হিসেবে সেট করুন।

gcloud config set project $PROJECT_ID

এরপর, এই কোডল্যাব দ্বারা ব্যবহৃত পরিবেশ ভেরিয়েবলগুলি সেট করুন।

export REGION=us-central1
export TOPIC_ID=crema-pubsub-topic
export SUBSCRIPTION_ID=crema-pubsub-sub
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

এই কোডল্যাবের জন্য একটি ডিরেক্টরি তৈরি করুন

mkdir crema-pubsub-codelab
cd crema-pubsub-codelab

API গুলি সক্ষম করুন

gcloud services enable \
        artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        parametermanager.googleapis.com

সবশেষে, নিশ্চিত করুন যে আপনার gcloud সর্বশেষ সংস্করণ ব্যবহার করছে।

gcloud components update

৩. পাব/সাব সেটআপ

আপনার কর্মী পুল যে বিষয় এবং পুল সাবস্ক্রিপশন প্রক্রিয়া করবে তা তৈরি করুন। ব্যাশ

বিষয় তৈরি করুন।

gcloud pubsub topics create $TOPIC_ID

সাবস্ক্রিপশন তৈরি করুন।

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

৪. আইএএম এবং পরিষেবা অ্যাকাউন্ট

প্রতিটি ক্লাউড রান রিসোর্সের জন্য একটি পরিষেবা অ্যাকাউন্ট তৈরি করার পরামর্শ দেওয়া হচ্ছে। এই কোডল্যাবে, আপনি নিম্নলিখিতগুলি তৈরি করবেন:

  • কনজিউমার SA: পাব/সাব বার্তা প্রক্রিয়াকরণকারী কর্মী পুলের পরিচয়।
  • CREMA SA: CREMA অটোস্কেলার পরিষেবার জন্য পরিচয়।

পরিষেবা অ্যাকাউন্ট তৈরি করুন

কর্মী পুল কনজিউমার SA তৈরি করুন:

gcloud iam service-accounts create $CONSUMER_SA_NAME \
  --display-name="PubSub Consumer Service Account"

কর্মী পুল তৈরি করুন CREMA পরিষেবা SA:

gcloud iam service-accounts create $CREMA_SA_NAME \
  --display-name="CREMA Autoscaler Service Account"

কনজিউমার এসএ-কে অনুমতি প্রদান করুন

সাবস্ক্রিপশন থেকে বার্তা সংগ্রহের জন্য কর্মী পুল গ্রাহক SA-কে অনুমতি দিন।

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

CREMA SA-কে অনুমতি দিন

প্যারামিটারগুলি পড়তে, কর্মী পুল স্কেল করতে এবং পাব/সাব মেট্রিক্স পর্যবেক্ষণ করতে CREMA-এর অনুমতি প্রয়োজন।

  1. অ্যাক্সেস প্যারামিটার ম্যানেজার (কনফিগ রিডার):
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/parametermanager.parameterViewer"
  1. ওয়ার্কার পুল স্কেল করুন (ক্লাউড রান ডেভেলপার):
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/run.developer"
  1. পাব/সাব মনিটর করুন:

পর্যবেক্ষণ দর্শকের ভূমিকা প্রদান করুন।

gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/monitoring.viewer"

CREMA পরিষেবা SA দেখার জন্য সাবস্ক্রিপশনে একটি নীতি যোগ করুন।

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

CREMA SA-এর জন্য পরিষেবা অ্যাকাউন্ট ব্যবহারকারীরও প্রয়োজন, যা ইনস্ট্যান্স কাউন্ট পরিবর্তন করতে প্রয়োজন:

gcloud iam service-accounts add-iam-policy-binding \
    $CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com \
    --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/iam.serviceAccountUser"

৫. SA অনুমতি যাচাই করুন

কোডল্যাব শুরু করার আগে, যাচাই করুন যে CREMA পরিষেবা SA-এর প্রকল্প-স্তরের সঠিক ভূমিকা রয়েছে।

gcloud projects get-iam-policy $PROJECT_ID \
  --flatten="bindings[].members" \
  --format="table(bindings.role)" \
  --filter="bindings.members:serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com"

এর ফলে নিম্নলিখিত ফলাফল পাওয়া উচিত:

roles/monitoring.viewer
roles/parametermanager.parameterViewer
roles/run.developer

পাব/সাব সাবস্ক্রিপশনের এমন একটি নীতি আছে যা CREMA পরিষেবা SA-কে এটি দেখার অনুমতি দেয় তা যাচাই করুন।

gcloud pubsub subscriptions get-iam-policy $SUBSCRIPTION_ID \
  --flatten="bindings[].members" \
  --filter="bindings.members:serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --format="table(bindings.role)"

এর ফলে

roles/pubsub.viewer

এবং CREMA SA-তে পরিষেবা অ্যাকাউন্ট ব্যবহারকারীর ভূমিকা আছে কিনা তা যাচাই করুন।

gcloud iam service-accounts get-iam-policy \
  $CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com \
  --flatten="bindings[].members" \
  --filter="bindings.members:serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com"

এর ফলে নিম্নলিখিত ফলাফল পাওয়া উচিত

bindings:
  members: serviceAccount:crema-service-account@<PROJECT_ID>.iam.gserviceaccount.com
  role: roles/iam.serviceAccountUser

এবং ওয়ার্কার পুল কনজিউমার এসএ-এর পাব/সাব সাবস্ক্রাইবার ভূমিকা রয়েছে

gcloud pubsub subscriptions get-iam-policy $SUBSCRIPTION_ID \
  --flatten="bindings[].members" \
  --filter="bindings.members:serviceAccount:$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --format="table(bindings.role)"

এর ফলে

ROLE
roles/pubsub.subscriber

৬. কনজিউমার ওয়ার্কার পুল তৈরি এবং স্থাপন করুন

আপনার কনজিউমার কোডের জন্য একটি ডিরেক্টরি তৈরি করুন এবং এটি লিখুন।

mkdir consumer
cd consumer
  1. একটি consumer.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}")
  1. একটি Dockerfile তৈরি করুন
FROM python:3.12-slim
RUN pip install google-cloud-pubsub
COPY consumer.py .
CMD ["python", "-u", "consumer.py"]
  1. কনজিউমার ওয়ার্কার পুল স্থাপন করুন

এই কোডল্যাবটি 0 টি ইনস্ট্যান্স সহ কর্মী পুল স্থাপনের পরামর্শ দেয়, যাতে আপনি CREMA সাবস্ক্রিপশনে Pub/Sub বার্তা সনাক্ত করার সময় কর্মী পুল স্কেল করতে দেখতে পারেন।

gcloud beta 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 কনফিগার করুন

  1. আপনার প্রকল্পের রুট ডিরেক্টরিতে ফিরে যান।
cd ..
  1. কনফিগ ফাইল তৈরি করুন 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_PLACEHOLDER/locations/REGION_PLACEHOLDER/workerpools/CONSUMER_WORKER_POOL_NAME_PLACEHOLDER
        triggers:
          - type: gcp-pubsub
            metadata:
              subscriptionName: "SUBSCRIPTION_ID_PLACEHOLDER"
              # Target number of undelivered messages per worker instance
              value: "10"
              mode: "SubscriptionSize"
            authenticationRef:
              name: adc-trigger-auth
  1. বিকল্প ভেরিয়েবল
sed -i "s/PROJECT_ID_PLACEHOLDER/$PROJECT_ID/g" crema-config.yaml
sed -i "s/REGION_PLACEHOLDER/$REGION/g" crema-config.yaml
sed -i "s/CONSUMER_WORKER_POOL_NAME_PLACEHOLDER/$CONSUMER_WORKER_POOL_NAME/g" crema-config.yaml
sed -i "s/SUBSCRIPTION_ID_PLACEHOLDER/$SUBSCRIPTION_ID/g" crema-config.yaml
  1. আপনার crema-config.yaml সঠিক কিনা তা যাচাই করুন।
if grep -q "_PLACEHOLDER" crema-config.yaml; then
  echo "❌ ERROR: Validations failed. '_PLACEHOLDER' was found in crema-config.yaml."
  echo "Please check your environment variables and run the 'sed' commands again."
else
  echo "✅ Config check passed: No placeholders found."
fi
  1. প্যারামিটার ম্যানেজারে আপলোড করুন

প্যারামিটার ম্যানেজারের জন্য অতিরিক্ত পরিবেশ ভেরিয়েবল সেট করুন

export PARAMETER_ID=crema-config
export PARAMETER_REGION=global
export PARAMETER_VERSION=1

প্যারামিটার রিসোর্স তৈরি করুন

gcloud parametermanager parameters create $PARAMETER_ID \
  --location=$PARAMETER_REGION \
  --parameter-format=YAML

প্যারামিটার সংস্করণ ১ তৈরি করুন

gcloud parametermanager parameters versions create $PARAMETER_VERSION \
  --parameter=crema-config \
  --project=$PROJECT_ID \
  --location=$PARAMETER_REGION \
  --payload-data-from-file=crema-config.yaml

প্যারামিটারটি সফলভাবে যোগ করা হয়েছে কিনা তা যাচাই করুন।

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

তোমার এরকম কিছু দেখা উচিত

projects/<YOUR_PROJECT_ID>/locations/global/parameters/crema-config/versions/1

৮. CREMA পরিষেবা স্থাপন করুন

এই বিভাগে, আপনি CREMA অটোস্কেলার পরিষেবাটি স্থাপন করবেন। আপনি সর্বজনীনভাবে উপলব্ধ ছবিটি ব্যবহার করবেন।

  1. CREMA-এর জন্য প্রয়োজনীয় পরিবেশগত ভেরিয়েবল সেট করুন
CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
  1. সংস্করণের নামের পথ যাচাই করুন
echo $CREMA_CONFIG_PARAM_VERSION

এটা দেখতে এরকম হওয়া উচিত

projects/<YOUR_PROJECT>/locations/global/parameters/crema-config/versions/1
  1. CREMA ছবির জন্য env var সেট করুন।
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0
  1. এবং CREMA পরিষেবা স্থাপন করুন

মনে রাখবেন যে বেস ইমেজটি প্রয়োজন।

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

9. লোড টেস্টিং

  1. একটি স্ক্রিপ্ট তৈরি করুন যা পাব/সাব টপিকে বার্তা প্রকাশ করবে।
touch load-pubsub.sh
  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."
  1. লোড পরীক্ষা চালান
chmod +x load-pubsub.sh
./load-pubsub.sh
  1. স্কেলিং পর্যবেক্ষণ করুন ৩-৪ মিনিট অপেক্ষা করুন। নতুন প্রমাণীকরণ রেফ কনফিগারেশনের উপর ভিত্তি করে সুপারিশকৃত উদাহরণগুলি দেখতে 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
  1. প্রক্রিয়াকরণ পর্যবেক্ষণ করুন। গ্রাহক লগগুলি দেখুন যাতে এটি ঘুরছে।
gcloud beta run worker-pools logs tail $CONSUMER_WORKER_POOL_NAME --region=$REGION

তুমি লগগুলো দেখতে পাবে যেমন

Done job-100

১০. সমস্যা সমাধান

প্রথমে, আপনাকে নির্ধারণ করতে হবে যে সমস্যাটি CREMA পরিষেবা কনফিগারেশনের নাকি PubSub কনজিউমার কনফিগারেশনের।

PubSub কনজিউমার অটোস্কেলারকে ০ এর পরিবর্তে ১ এ সেট করুন। যদি এটি তাৎক্ষণিকভাবে pubsub বার্তাগুলি প্রক্রিয়া করতে শুরু করে, তাহলে এটি CREMA এর সমস্যা। যদি এটি pubsub বার্তাগুলি প্রক্রিয়া না করে, তাহলে pubsub গ্রাহকের সমস্যা।

১১. অভিনন্দন!

কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!

আমরা ক্লাউড রান ডকুমেন্টেশন পর্যালোচনা করার পরামর্শ দিচ্ছি।

আমরা যা কভার করেছি

  • কিভাবে একটি পাব/সাব টপিক এবং সাবস্ক্রিপশন তৈরি করবেন এবং সেই টপিকে বার্তা পাঠাবেন।
  • Pub/Sub থেকে বার্তা গ্রহণকারী ক্লাউড রান কর্মী পুল (ভোক্তা) কীভাবে স্থাপন করবেন?
  • পাব/সাব সাবস্ক্রিপশনে থাকা বার্তার সংখ্যার উপর ভিত্তি করে আপনার কর্মী পুলকে স্বয়ংক্রিয়ভাবে স্কেল করার জন্য ক্লাউড রান পরিষেবা হিসেবে GitHub-এ CREMA প্রকল্পটি কীভাবে স্থাপন করবেন।
  • স্থানীয়ভাবে একটি পাইথন স্ক্রিপ্ট চালিয়ে লোড জেনারেট করে আপনার অটোস্কেলিং কনফিগারেশন কীভাবে পরীক্ষা করবেন।

১২. পরিষ্কার করা

এই টিউটোরিয়ালে ব্যবহৃত রিসোর্সগুলির জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে, আপনি এই কোডল্যাবে তৈরি করা রিসোর্সগুলি মুছে ফেলতে পারেন অথবা সম্পূর্ণ প্রকল্পটি মুছে ফেলতে পারেন।

এই কোডল্যাবে ব্যবহৃত রিসোর্সগুলি মুছুন

  1. ক্লাউড রান CREMA পরিষেবাটি মুছুন
gcloud run services delete $CREMA_SERVICE_NAME --region=$REGION --quiet
  1. ক্লাউড রান ওয়ার্কার পুল কনজিউমার মুছে ফেলুন
gcloud beta run worker-pools delete $CONSUMER_WORKER_POOL_NAME --region=$REGION --quiet
  1. পাব/সাব সাবস্ক্রিপশন এবং বিষয় মুছে ফেলুন
gcloud pubsub subscriptions delete $SUBSCRIPTION_ID --quiet
gcloud pubsub topics delete $TOPIC_ID --quiet
  1. প্যারামিটার ম্যানেজার কনফিগারেশনটি মুছুন

প্যারামিটারের ভিতরে থাকা সংস্করণটি মুছুন

gcloud parametermanager parameters versions delete $PARAMETER_VERSION \
  --parameter=$PARAMETER_ID \
  --location=$PARAMETER_REGION \
  --quiet

এখন খালি প্যারামিটারটি মুছে ফেলুন।

gcloud parametermanager parameters delete $PARAMETER_ID \
  --location=$PARAMETER_REGION \
  --quiet
  1. পরিষেবা অ্যাকাউন্টগুলি মুছুন
gcloud iam service-accounts delete "$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" --quiet
gcloud iam service-accounts delete "$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" --quiet

অথবা সম্পূর্ণ প্রকল্পটি মুছে ফেলুন

সম্পূর্ণ প্রকল্পটি মুছে ফেলার জন্য, Manage Resources এ যান, ধাপ ২-এ তৈরি করা প্রকল্পটি নির্বাচন করুন এবং Delete নির্বাচন করুন। আপনি যদি প্রকল্পটি মুছে ফেলেন, তাহলে আপনার Cloud SDK-তে প্রকল্পগুলি পরিবর্তন করতে হবে। আপনি gcloud projects list চালিয়ে সমস্ত উপলব্ধ প্রকল্পের তালিকা দেখতে পারেন।