Cloud Tasks-এর মাধ্যমে ফাংশন এনকিউ করা

টাস্ক কিউ ফাংশন, আপনার অ্যাপকে সময়-সাপেক্ষ, রিসোর্স-ইনটেনসিভ বা ব্যান্ডউইথ-সীমিত টাস্ক অ্যাসিঙ্ক্রোনাসভাবে, আপনার মূল অ্যাপ্লিকেশন ফ্লোয়ের বাইরে রান করতে সাহায্য করার জন্য Google Cloud Tasks সুবিধা নেয়।

যেমন, ধরে নিন যে আপনি প্রচুর ছবি ফাইলের ব্যাক-আপ তৈরি করতে চান, যেগুলি বর্তমানে রেট লিমিট সহ API-তে হোস্ট করা আছে। সেই API-এর একজন দায়বদ্ধ কনজিউমার হতে হলে, আপনাকে সেটির রেট লিমিট মেনে চলতে হবে। এছাড়াও, এই ধরনের দীর্ঘ সময় ধরে চলা জব টাইম-আউট এবং মেমরি সংক্রান্ত সীমাবদ্ধতার কারণে ব্যর্থ হতে পারে।

এই জটিলতা কমাতে, আপনি এমন একটি টাস্ক কিউ ফাংশন লিখতে পারেন যা scheduleTime এবং dispatchDeadline-এর মতো প্রাথমিক টাস্ক বিকল্প সেট করে এবং তারপরে Cloud Tasks-এর কিউতে ফাংশনটি হ্যান্ড-অফ করে। এই ধরনের অপারেশন যাতে কার্যকরভাবে কনজেশন কন্ট্রোল ও রিট্রাই নীতি মেনে চলে, তা নিশ্চিত করার জন্য Cloud Tasks এনভায়রনমেন্ট বিশেষভাবে ডিজাইন করা হয়েছে।

টাস্ক কিউ ফাংশন কাজ করানোর জন্য Firebase SDK-এর Cloud Functions for Firebase v3.20.1 ও এর পরের যেকোনও ভার্সন Firebase Admin SDK v10.2.0 ও এর পরের যেকোনও ভার্সনের সাথে ইন্টারঅপারেট করে।

Firebase-এর সাথে টাস্ক কিউ ফাংশন ব্যবহার করলে, Cloud Tasks প্রসেসিংয়ের জন্য চার্জ লাগতে পারে। আরও তথ্যের জন্য Cloud Tasks দাম দেখুন।

টাস্ক কোয়ের ফাংশন তৈরি করা

টাস্ক কিউ ফাংশন ব্যবহার করতে, এই ওয়ার্কফ্লো অনুসরণ করুন:

  1. Cloud Functions-এর জন্য Firebase SDK ব্যবহার করে টাস্ক কোয়ের ফাংশন লেখো।
  2. HTTP অনুরোধের মাধ্যমে ট্রিগার করে আপনার ফাংশন পরীক্ষা করুন।
  3. Firebase CLI-এর মাধ্যমে আপনার ফাংশন ডেপ্লয় করুন। প্রথমবার আপনার টাস্ক কিউ ফাংশন ডেপ্লয় করার সময়, CLI আপনার সোর্স কোডে উল্লেখ করা বিকল্প (রেট লিমিটিং ও আবার চেষ্টা করা) সহ Cloud Tasks-এ টাস্ক কিউ তৈরি করবে।
  4. নতুন তৈরি টাস্ক কোয়েরিতে টাস্ক যোগ করুন এবং প্রয়োজন হলে এক্সিকিউশন শিডিউল সেট-আপ করার জন্য প্যারামিটার পাস করুন। Admin SDK ব্যবহার করে কোড লিখে এবং Cloud Functions for Firebase-এ সেটি ডেপ্লয় করে আপনি এটি করতে পারবেন।

টাস্ক কিউ ফাংশন লেখা

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

Node.js

// Dependencies for task queue functions.
const {onTaskDispatched} = require("firebase-functions/tasks");
const {onRequest, HttpsError} = require("firebase-functions/https");
const {requiresRole} = require("firebase-functions");
const {getFunctions} = require("firebase-admin/functions");
const {logger} = require("firebase-functions");

// Dependencies for image backup.
const {URL, URLSearchParams} = require("node:url");
const path = require("path");
const {initializeApp} = require("firebase-admin/app");
const {getStorage} = require("firebase-admin/storage");

Python

# Dependencies for task queue functions.
from google.cloud import tasks_v2
import requests
from firebase_functions.options import RetryConfig, RateLimits, SupportedRegion

# Dependencies for image backup.
from datetime import datetime, timedelta
import json
import pathlib
from urllib.parse import urlparse
from firebase_admin import initialize_app, storage, functions
from firebase_functions import https_fn, tasks_fn, params
import google.auth
from google.auth.transport.requests import AuthorizedSession

টাস্ক কোয়েরি ফাংশনের জন্য onTaskDispatched অথবা on_task_dispatched ব্যবহার করুন। টাস্ক কিউ ফাংশন লেখার সময় আপনি প্রতি কিউয়ে আবার চেষ্টা করা ও রেট-লিমিটিং কনফিগারেশন সেট করতে পারবেন।

টাস্ক কোয়ের ফাংশন কনফিগার করা

টাস্ক কিউ ফাংশন, টাস্ক কিউয়ের রেট লিমিট ও আবার চেষ্টা করার আচরণকে সঠিকভাবে নিয়ন্ত্রণ করতে কনফিগারেশন সেটিংসের একটি শক্তিশালী সেট সহ আসে:

Node.js

exports.backupapod = onTaskDispatched(
    {
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }, async (req) => {

Python

@tasks_fn.on_task_dispatched(
    retry_config=RetryConfig(max_attempts=5, min_backoff_seconds=60),
    rate_limits=RateLimits(max_concurrent_dispatches=10),
)
def backupapod(req: tasks_fn.CallableRequest) -> str:
    """Grabs Astronomy Photo of the Day (APOD) using NASA's API."""
  • retryConfig.maxAttempts=5: টাস্ক কিউতে থাকা প্রতিটি টাস্ক অটোমেটিক সর্বাধিক ৫ বার আবার চেষ্টা করা হয়। এটি নেটওয়ার্ক এরর বা নির্ভর করে এমন কোনও এক্সটার্নাল পরিষেবায় সাময়িক বিঘ্নের মতো ক্ষণস্থায়ী এরর কমাতে সাহায্য করে।

  • retryConfig.minBackoffSeconds=60: প্রতিটি টাস্কের প্রতিটি প্রচেষ্টার মধ্যে অন্তত ৬০ সেকেন্ড সময় থাকে। এর ফলে প্রতিটি প্রচেষ্টার মধ্যে একটি বড় বাফার তৈরি হয় তাই আমরা ৫টি প্রচেষ্টার সবকটি খুব দ্রুত ব্যবহার করে ফেলি না।

  • rateLimits.maxConcurrentDispatch=6: কোনও নির্দিষ্ট সময়ে সর্বাধিক ৬টি টাস্ক ডিসপ্যাচ করা হয়। এটি নিশ্চিত করে যে অন্তর্নিহিত ফাংশনে অনুরোধের একটি অবিচ্ছিন্ন স্ট্রিম আছে এবং অ্যাক্টিভ ইনস্ট্যান্স এবং কোল্ড স্টার্টের সংখ্যা কমাতে সাহায্য করে।

টাস্কের সারি সংক্রান্ত ফাংশন টেস্ট করা

বেশিরভাগ ক্ষেত্রে, Cloud Functions এমুলেটর হল টাস্ক কিউ ফাংশন পরীক্ষা করার সবচেয়ে ভালো উপায়। কীভাবে টাস্ক কিউ ফাংশন এমুলেশনের জন্য আপনার অ্যাপকে ইনস্ট্রুমেন্ট করবেন তা জানতে Emulator Suite ডকুমেন্টেশন দেখুন।

এছাড়াও, টাস্ক কিউ ফাংশনগুলি Firebase Local Emulator Suite-এ সাধারণ HTTP ফাংশন হিসেবে এক্সপোজ করা হয়। আপনি JSON ডেটা পেলোড সহ HTTP POST অনুরোধ পাঠিয়ে কোনও এমুলেটেড টাস্ক ফাংশন পরীক্ষা করতে পারেন:

 # start the Local Emulator Suite
 firebase emulators:start

 # trigger the emulated task queue function
 curl \
  -X POST                                            # An HTTP POST request...
  -H "content-type: application/json" \              # ... with a JSON body
  http://localhost:$PORT/$PROJECT_ID/$REGION/$NAME \ # ... to function url
  -d '{"data": { ... some data .... }}'              # ... with JSON encoded data

টাস্ক কিউ ফাংশন ডেপ্লয় করা

Firebase CLI ব্যবহার করে টাস্ক কিউ ফাংশন ডিপ্লয় করুন:

$ firebase deploy --only functions:backupapod

প্রথমবার টাস্ক কিউ ফাংশন ডেপ্লয় করার সময়, CLI আপনার সোর্স কোডে উল্লেখ করা বিকল্প (রেট লিমিটিং ও আবার চেষ্টা করা) সহ Cloud Tasks-এ একটি টাস্ক কিউ তৈরি করে।

ফাংশন ডেপ্লয় করার সময় আপনি অনুমতির ব্যাপারে কোনও সমস্যার সম্মুখীন হলে, নিশ্চিত করুন যে ডেপ্লয়মেন্ট কমান্ড চালানো ব্যবহারকারীকে উপযুক্ত IAM ভূমিকা অ্যাসাইন করা হয়েছে।

টাস্ক কিউ ফাংশন এনকিউ করা

Cloud Tasks থেকে টাস্ক কিউ ফাংশন এনকিউ করা যেতে পারে। Cloud Functions for Firebase-এর মতো বিশ্বস্ত সার্ভার এনভায়রনমেন্টে Firebase Admin SDK ব্যবহার করে Node.js বা Python-এর জন্য Google Cloud লাইব্রেরি ব্যবহার করা যেতে পারে। আপনি Admin SDK-এ নতুন হলে, শুরু করতে কোনও সার্ভারে Firebase যোগ করুন দেখুন।

একটি সাধারণ ফ্লো নতুন টাস্ক তৈরি করে, এটিকে Cloud Tasks-এ এনকিউ করে এবং টাস্কের জন্য কনফিগারেশন সেট করে:

Node.js

exports.enqueuebackuptasks = onRequest(
    async (_request, response) => {
      const queue = getFunctions().taskQueue("backupapod");

      const enqueues = [];
      for (let i = 0; i <= BACKUP_COUNT; i += 1) {
        const iteration = Math.floor(i / HOURLY_BATCH_SIZE);
        // Delay each batch by N * hour
        const scheduleDelaySeconds = iteration * (60 * 60);

        const backupDate = new Date(BACKUP_START_DATE);
        backupDate.setDate(BACKUP_START_DATE.getDate() + i);
        // Extract just the date portion (YYYY-MM-DD) as string.
        const date = backupDate.toISOString().substring(0, 10);
        enqueues.push(
            queue.enqueue({date}, {
              scheduleDelaySeconds,
              dispatchDeadlineSeconds: 60 * 5, // 5 minutes
            }),
        );
      }
      await Promise.all(enqueues);
      response.sendStatus(200);
    });

Python

@https_fn.on_request()
def enqueuebackuptasks(_: https_fn.Request) -> https_fn.Response:
    """Adds backup tasks to a Cloud Tasks queue."""
    task_queue = functions.task_queue("backupapod")
    target_uri = get_function_url("backupapod")

    for i in range(BACKUP_COUNT):
        batch = i // HOURLY_BATCH_SIZE

        # Delay each batch by N hours
        schedule_delay = timedelta(hours=batch)
        schedule_time = datetime.now() + schedule_delay

        dispatch_deadline_seconds = 60 * 5  # 5 minutes

        backup_date = BACKUP_START_DATE + timedelta(days=i)
        body = {"data": {"date": backup_date.isoformat()[:10]}}
        task_options = functions.TaskOptions(
            schedule_time=schedule_time,
            dispatch_deadline_seconds=dispatch_deadline_seconds,
            uri=target_uri,
        )
        task_queue.enqueue(body, task_options)
    return https_fn.Response(status=200, response=f"Enqueued {BACKUP_COUNT} tasks")
  • স্যাম্পেল কোডটি Nতম টাস্কের জন্য Nতম মিনিটের বিলম্ব যোগ করে টাস্কের এক্সিকিউশন ছড়িয়ে দেওয়ার চেষ্টা করে। এর অর্থ হল ~ ১টি টাস্ক/মিনিট ট্রিগার করা। মনে রাখবেন, আপনি যদি Cloud Tasks নির্দিষ্ট সময়ে কোনও টাস্ক ট্রিগার করতে চান, তাহলে scheduleTime (Node.js) বা schedule_time (Python)-ও ব্যবহার করতে পারেন।

  • টাস্ক সম্পূর্ণ করার জন্য Cloud Tasks সর্বাধিক যত সময় অপেক্ষা করবে তা স্যাম্পেল কোড সেট করে। Cloud Tasks আবার চেষ্টা করবে কিউয়ের আবার চেষ্টা করা সংক্রান্ত কনফিগারেশন মেনে অথবা এই ডেডলাইন না পৌঁছানো পর্যন্ত। নমুনায়, টাস্কটি ৫ বার পর্যন্ত আবার চেষ্টা করার জন্য সারি কনফিগার করা হয়েছে, কিন্তু পুরো প্রসেস (আবার চেষ্টা করা সহ) ৫ মিনিটের বেশি সময় নিলে টাস্কটি অটোমেটিক বাতিল হয়ে যায়।

সমস্যার সমাধান

লগিং ব্যবহার করে টাস্ক কোয়ের সমস্যা কীভাবে ডায়াগনসিস করতে হয় এবং প্রয়োজনীয় IAM অনুমতি কীভাবে কনফিগার করতে হয় তা জানুন।

Cloud Tasks লগিং চালু করুন

Cloud Tasks থেকে পাওয়া লগে টাস্কের সাথে যুক্ত অনুরোধের স্ট্যাটাসের মতো দরকারী ডায়াগনস্টিক তথ্য থাকে। ডিফল্ট হিসেবে, Cloud Tasks থেকে পাওয়া লগ বন্ধ করা থাকে কারণ এটি আপনার প্রোজেক্টে প্রচুর পরিমাণে লগ তৈরি করতে পারে। আপনি যখন টাস্ক কিউ ফাংশন অ্যাক্টিভভাবে ডেভেলপ ও ডিবাগ করছেন, তখন আমরা আপনাকে ডিবাগ লগ চালু করতে সাজেস্ট করি। লগিং চালু করা দেখুন।

IAM অনুমতি

টাস্ক এনকিউ করার সময় অথবা Cloud Tasks আপনার টাস্ক কিউ ফাংশন ইনভোক করার চেষ্টা করলে, আপনি PERMISSION DENIED সমস্যা দেখতে পেতে পারেন। আপনার প্রোজেক্টে নিম্নলিখিত IAM বাইন্ডিং আছে কিনা তা নিশ্চিত করুন:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • Cloud Tasks-এ টাস্ক এনকিউ করার জন্য ব্যবহৃত পরিচিতিকে Cloud Tasks-এ টাস্কের সাথে যুক্ত পরিষেবা অ্যাকাউন্ট ব্যবহার করার অনুমতি থাকতে হবে।

    নমুনায়, এটি হল App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট।

App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহারকারী হিসেবে App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট কীভাবে যোগ করবেন সেই সংক্রান্ত নির্দেশাবলীর জন্য Google Cloud IAM ডকুমেন্টেশন দেখুন।

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker