টাস্ক কিউ ফাংশন Google Cloud Tasks -এর সুবিধা নেয় যাতে আপনার অ্যাপ সময়সাপেক্ষ, রিসোর্স-ইনটেনসিভ বা ব্যান্ডউইথ-সীমিত টাস্ক অ্যাসিঙ্ক্রোনাসভাবে, আপনার মূল অ্যাপ্লিকেশন ফ্লোর বাইরে চালাতে পারে।
যেমন, ধরুন আপনি রেট লিমিট সহ API-তে বর্তমানে হোস্ট করা ছবির ফাইলের একটি বড় সেটের ব্যাক-আপ তৈরি করতে চান। সেই API-এর একজন দায়িত্বশীল গ্রাহক হতে, আপনাকে তাদের রেট সীমা মেনে চলতে হবে। এছাড়াও, এই ধরনের দীর্ঘ সময় ধরে চলা কাজ টাইমআউট ও মেমরি সীমার কারণে ব্যর্থ হতে পারে।
এই জটিলতা কমাতে, আপনি একটি টাস্ক কিউ ফাংশন লিখতে পারেন যা scheduleTime এবং dispatchDeadline-এর মতো প্রাথমিক টাস্ক বিকল্প সেট করে এবং তারপর Cloud Tasks-এ একটি কিউতে ফাংশনটি হস্তান্তর করে। Cloud Tasks
এনভায়রনমেন্ট বিশেষভাবে ডিজাইন করা হয়েছে যাতে এই ধরনের অপারেশনের জন্য কার্যকর কনজেশন কন্ট্রোল ও
আবার চেষ্টা করার নীতি নিশ্চিত করা যায়।
Cloud Functions for Firebase v3.20.1 এবং তার পরবর্তী ভার্সনের জন্য Firebase SDK, Firebase Admin SDK v10.2.0 এবং তার পরবর্তী ভার্সনের সাথে ইন্টারঅপারেট করে যাতে টাস্ক কিউ ফাংশন কাজ করে।
Firebase-এর সাথে টাস্ক কিউ ফাংশন ব্যবহার করলে Cloud Tasks প্রসেসিংয়ের জন্য চার্জ করা হতে পারে। আরও তথ্যের জন্য Cloud Tasks-এর দাম দেখুন।
টাস্ক কিউ ফাংশন তৈরি করুন
টাস্ক কিউ ফাংশন ব্যবহার করতে, এই ওয়ার্কফ্লো অনুসরণ করুন:
- Cloud Functions-এর জন্য Firebase SDK ব্যবহার করে একটি টাস্ক কিউ ফাংশন লিখুন।
- HTTP অনুরোধের মাধ্যমে ট্রিগার করে আপনার ফাংশন পরীক্ষা করুন।
- Firebase CLI-এর মাধ্যমে আপনার ফাংশন ডিপ্লয় করুন। প্রথমবার আপনার টাস্ক কিউ ফাংশন ডিপ্লয় করার সময়, CLI আপনার সোর্স কোডে নির্দিষ্ট করা বিকল্প (রেট লিমিটিং ও আবার চেষ্টা করা) সহ Cloud Tasks-এ টাস্ক কিউ তৈরি করবে।
- নতুন তৈরি করা টাস্ক কিউতে টাস্ক যোগ করুন, প্রয়োজন হলে এক্সিকিউশন শিডিউল সেট-আপ করার জন্য প্যারামিটার পাস করুন। আপনি 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-এর মতো বিশ্বস্ত সার্ভার এনভায়রনমেন্ট থেকে, Node.js-এর জন্য Firebase Admin SDK বা 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 বাইন্ডিং আছে কিনা তা ভালভাবে দেখে নিন:
Cloud Tasks-এ টাস্ক এনকিউ করার জন্য ব্যবহৃত পরিচয়ের জন্য
cloudtasks.tasks.createIAM অনুমতি প্রয়োজন।স্যাম্পেলে, এটি হল App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট
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 ডকুমেন্টেশন দেখুন।
টাস্ক কিউ ফাংশন ট্রিগার করার জন্য ব্যবহৃত পরিচয়ের
cloudfunctions.functions.invokeঅনুমতি প্রয়োজন।স্যাম্পেলে, এটি হল App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট
gcloud functions add-iam-policy-binding $FUNCTION_NAME \
--region=us-central1 \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudfunctions.invoker