ক্লাউড টাস্কের সাথে সারিবদ্ধ ফাংশন

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

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

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

Cloud Functions for Firebase জন্য Firebase SDK টাস্ক কিউ ফাংশনগুলিকে সমর্থন করার জন্য 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 এর অ্যাস্ট্রোনমি পিকচার অফ দ্য ডে থেকে সমস্ত চিত্রের ব্যাক আপ নেয়। শুরু করতে, প্রয়োজনীয় মডিউলগুলি আমদানি করুন:

নোড.জেএস

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

// Dependencies for image backup.
const path = require("path");
const {initializeApp} = require("firebase-admin/app");
const {getStorage} = require("firebase-admin/storage");
const {GoogleAuth} = require("google-auth-library");

পাইথন

# 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 ব্যবহার করুন। টাস্ক কিউ ফাংশন লেখার সময় আপনি প্রতি-কিউ রিট্রাই এবং রেট-লিমিটিং কনফিগারেশন সেট করতে পারেন।

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

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

নোড.জেএস

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

পাইথন

@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 : প্রতিটি কাজ প্রতিটি প্রচেষ্টা থেকে কমপক্ষে 60 সেকেন্ডের ব্যবধানে পুনরায় চেষ্টা করা হয়। এটি প্রতিটি প্রচেষ্টার মধ্যে একটি বড় বাফার প্রদান করে যাতে আমরা 5টি পুনরায় চেষ্টা খুব দ্রুত শেষ করতে তাড়াহুড়ো না করি।

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

টাস্ক কিউ ফাংশন পরীক্ষা করুন

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

অতিরিক্তভাবে, 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 ভূমিকাগুলি স্থাপন কমান্ড চালানো ব্যবহারকারীর জন্য নির্ধারিত হয়েছে।

টাস্ক কিউ ফাংশনগুলিকে সারিবদ্ধ করুন

Node.js-এর জন্য Firebase Admin SDK অথবা Python-এর জন্য Google Cloud লাইব্রেরি ব্যবহার করে Cloud Functions for Firebase মতো বিশ্বস্ত সার্ভার পরিবেশ থেকে Task queue ফাংশনগুলিকে Cloud Tasks এ সারিবদ্ধ করা যেতে পারে। আপনি যদি Admin SDK তে নতুন হন, তাহলে শুরু করতে "Add Firebase to a server" দেখুন।

একটি সাধারণ প্রবাহ একটি নতুন টাস্ক তৈরি করে, এটিকে Cloud Tasks সারিবদ্ধ করে এবং টাস্কের জন্য কনফিগারেশন সেট করে:

নোড.জেএস

exports.enqueuebackuptasks = onRequest(
    async (_request, response) => {
      const queue = getFunctions().taskQueue("backupapod");
      const targetUri = await getFunctionUrl("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
              uri: targetUri,
            }),
        );
      }
      await Promise.all(enqueues);
      response.sendStatus(200);
    });

পাইথন

@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")
  • নমুনা কোডটি Nth টাস্কের জন্য Nth মিনিটের বিলম্বকে যুক্ত করে কাজগুলি সম্পাদনের প্রক্রিয়াকে বিস্তৃত করার চেষ্টা করে। এর অর্থ হল ~ 1 টাস্ক/মিনিট ট্রিগার করা। মনে রাখবেন যে আপনি যদি Cloud Tasks একটি নির্দিষ্ট সময়ে একটি কাজ ট্রিগার করতে চান তবে আপনি scheduleTime (Node.js) অথবা schedule_time (Python) ব্যবহার করতে পারেন।

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

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

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 ডিফল্ট পরিষেবা অ্যাকাউন্ট কীভাবে যুক্ত করবেন তার নির্দেশাবলীর জন্য গুগল ক্লাউড আইএএম ডকুমেন্টেশন দেখুন।

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