टास्क सूची के फ़ंक्शन, Google Cloud Tasks का फ़ायदा लेते हैं. इससे आपके ऐप्लिकेशन को ज़्यादा समय लेने वाले, ज़्यादा संसाधनों का इस्तेमाल करने वाले या सीमित बैंडविड्थ वाले टास्क को एसिंक्रोनस तरीके से चलाने में मदद मिलती है. ये टास्क, आपके मुख्य ऐप्लिकेशन फ़्लो से बाहर होते हैं.
उदाहरण के लिए, मान लें कि आपको इमेज फ़ाइलों के एक बड़े सेट का बैकअप बनाना है. ये फ़ाइलें, फ़िलहाल किसी ऐसे एपीआई पर होस्ट की गई हैं जिसमें अनुरोध संख्या सीमित करने की सुविधा है. एपीआई का ज़िम्मेदारी से इस्तेमाल करने के लिए, आपको अनुरोध संख्या सीमित करने की सुविधा का पालन करना होगा. इसके अलावा, लंबे समय तक चलने वाले इस तरह के जॉब, टाइम आउट और मेमोरी की सीमाओं की वजह से फ़ेल हो सकते हैं.
इस जटिलता को कम करने के लिए, टास्क सूची वाला ऐसा फ़ंक्शन लिखा जा सकता है जो scheduleTime और dispatchDeadline जैसे बुनियादी टास्क के विकल्प सेट करता है. इसके बाद, फ़ंक्शन को Cloud Tasks में मौजूद सूची को सौंप देता है. Cloud Tasks एनवायरमेंट को खास तौर पर इस तरह से डिज़ाइन किया गया है कि इस तरह के ऑपरेशन के लिए, कंजेशन कंट्रोल और फिर से कोशिश करने की नीतियां असरदार तरीके से काम कर सकें.
Cloud Functions for Firebase के लिए Firebase SDK टूल का वर्शन 3.20.1 और इसके बाद के वर्शन, Firebase Admin SDK के वर्शन 10.2.0 और इसके बाद के वर्शन के साथ काम करते हैं. इससे टास्क सूची के फ़ंक्शन इस्तेमाल किए जा सकते हैं.
Firebase के साथ टास्क सूची वाले फ़ंक्शन इस्तेमाल करने पर, Cloud Tasks प्रोसेसिंग के लिए शुल्क लिया जा सकता है. ज़्यादा जानकारी के लिए, Cloud Tasks की कीमत देखें.
टास्क सूची वाले फ़ंक्शन बनाना
टास्क सूची के फ़ंक्शन इस्तेमाल करने के लिए, यह वर्कफ़्लो अपनाएं:
- Cloud Functions के लिए Firebase SDK टूल का इस्तेमाल करके, टास्क सूची फ़ंक्शन लिखें.
- एचटीटीपी अनुरोध से ट्रिगर करके, अपने फ़ंक्शन की जांच करें.
- Firebase सीएलआई का इस्तेमाल करके, अपना फ़ंक्शन डिप्लॉय करें. टास्क सूची फ़ंक्शन को पहली बार डिप्लॉय करने पर, सीएलआई Cloud Tasks में एक टास्क सूची बनाएगा. इसमें आपके सोर्स कोड में बताए गए विकल्प (अनुरोध संख्या सीमित करना और फिर से कोशिश करना) शामिल होंगे.
- नई टास्क सूची में टास्क जोड़ें. साथ ही, ज़रूरत पड़ने पर टास्क को पूरा करने का शेड्यूल सेट अप करने के लिए पैरामीटर पास करें. इसके लिए, Admin SDK का इस्तेमाल करके कोड लिखें और उसे Cloud Functions for Firebase पर डिप्लॉय करें.
टास्क सूची वाले फ़ंक्शन लिखना
इस सेक्शन में दिए गए कोड सैंपल, एक ऐसे ऐप्लिकेशन पर आधारित हैं जो नासा की एस्ट्रोनॉमी पिक्चर ऑफ़ द डे की सभी इमेज का बैक अप लेने वाली सेवा सेट अप करता है. शुरू करने के लिए, ज़रूरी मॉड्यूल इंपोर्ट करें:
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: हर टास्क को कम से कम 60 सेकंड के अंतराल पर फिर से आज़माया जाता है. इससे हर कोशिश के बीच काफ़ी समय मिल जाता है, ताकि हम पांच बार कोशिश करने की सीमा को जल्दी से खत्म न कर दें.rateLimits.maxConcurrentDispatch=6: एक बार में ज़्यादा से ज़्यादा छह टास्क भेजे जा सकते हैं. इससे, फ़ंक्शन को लगातार अनुरोध मिलते रहते हैं. साथ ही, ऐक्टिव इंस्टेंस और कोल्ड स्टार्ट की संख्या कम करने में मदद मिलती है.
टास्क सूची के फ़ंक्शन टेस्ट करना
ज़्यादातर मामलों में, टास्क सूची के फ़ंक्शन की जांच करने के लिए, Cloud Functions एम्युलेटर सबसे अच्छा तरीका है. टास्क सूची के फ़ंक्शन को एम्युलेट करने के लिए, अपने ऐप्लिकेशन को इंस्ट्रुमेंट करने का तरीका जानने के लिए, Emulator Suite का दस्तावेज़ देखें.
इसके अलावा, टास्क सूची के फ़ंक्शन, Firebase Local Emulator Suite में सामान्य एचटीटीपी फ़ंक्शन के तौर पर दिखते हैं. एम्युलेट किए गए टास्क फ़ंक्शन को टेस्ट करने के लिए, JSON डेटा पेलोड के साथ एचटीटीपी पोस्ट अनुरोध भेजा जा सकता है:
# 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 सीएलआई का इस्तेमाल करके, टास्क सूची फ़ंक्शन को डिप्लॉय करें:
$ firebase deploy --only functions:backupapod
टास्क सूची वाले फ़ंक्शन को पहली बार डिप्लॉय करने पर, सीएलआई Cloud Tasks में टास्क सूची बनाता है. इसमें आपके सोर्स कोड में बताए गए विकल्प (अनुरोध संख्या सीमित करना और फिर से कोशिश करना) शामिल होते हैं.
अगर फ़ंक्शन डिप्लॉय करते समय आपको अनुमति से जुड़ी गड़बड़ियां मिलती हैं, तो पक्का करें कि डिप्लॉयमेंट कमांड चलाने वाले उपयोगकर्ता को सही आईएएम भूमिकाएं असाइन की गई हों.
टास्क सूची के फ़ंक्शन को सूची में जोड़ना
टास्क सूची के फ़ंक्शन, 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 मिनट की देरी को जोड़ता है. इसका मतलब है कि हर मिनट में एक टास्क ट्रिगर होता है. ध्यान दें कि अगर आपको किसी टास्क को किसी खास समय पर ट्रिगर करना है, तो
scheduleTime(Node.js) याschedule_time(Python) का भी इस्तेमाल किया जा सकता है.Cloud Tasksसैंपल कोड, उस समयसीमा को सेट करता है जिसके बाद Cloud Tasks, किसी टास्क के पूरा होने का इंतज़ार नहीं करेगा. Cloud Tasks, टास्क को फिर से पूरा करने की कोशिश करेगा. ऐसा, सूची के फिर से कोशिश करने के कॉन्फ़िगरेशन के मुताबिक या इस समयसीमा के खत्म होने तक किया जाएगा. सैंपल में, सूची को इस तरह कॉन्फ़िगर किया गया है कि टास्क को पांच बार फिर से आज़माया जा सके. हालांकि, अगर पूरी प्रोसेस (फिर से कोशिश करने के साथ) में पांच मिनट से ज़्यादा समय लगता है, तो टास्क अपने-आप रद्द हो जाता है.
समस्या का हल
लॉगिंग का इस्तेमाल करके, टास्क सूची से जुड़ी समस्याओं का पता लगाने और ज़रूरी IAM अनुमतियां कॉन्फ़िगर करने का तरीका जानें.
Cloud Tasks लॉगिंग की सुविधा चालू करना
Cloud Tasks के लॉग में, गड़बड़ी की जानकारी देने वाली काम की जानकारी होती है. जैसे, किसी टास्क से जुड़े अनुरोध की स्थिति. डिफ़ॉल्ट रूप से, Cloud Tasks से मिलने वाले लॉग बंद होते हैं. ऐसा इसलिए होता है, क्योंकि यह आपके प्रोजेक्ट पर बड़ी संख्या में लॉग जनरेट कर सकता है. हमारा सुझाव है कि टास्क सूची के फ़ंक्शन को डेवलप और डीबग करते समय, डीबग लॉग चालू करें. लॉगिंग की सुविधा चालू करना लेख पढ़ें.
IAM से जुड़ी अनुमतियां
टास्क को सूची में शामिल करते समय या Cloud Tasks के आपके टास्क सूची फ़ंक्शन को शुरू करने की कोशिश करते समय, आपको PERMISSION DENIED गड़बड़ियां दिख सकती हैं. पक्का करें कि आपके प्रोजेक्ट में ये आईएएम बाइंडिंग हों:
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