टास्क क्यू फ़ंक्शन, Google Cloud Tasks का इस्तेमाल करते हैं. इससे आपके ऐप्लिकेशन को ऐसे टास्क को एसिंक्रोनस तरीके से चलाने में मदद मिलती है जिनमें ज़्यादा समय लगता है, ज़्यादा संसाधनों की ज़रूरत होती है या बैंडविथ सीमित होती है. ये टास्क, आपके मुख्य ऐप्लिकेशन फ़्लो के बाहर चलाए जाते हैं.
उदाहरण के लिए, मान लें कि आपको इमेज फ़ाइलों के एक बड़े सेट का बैकअप बनाना है. ये फ़ाइलें फ़िलहाल, दर सीमा वाले एपीआई पर होस्ट की गई हैं. एपीआई का सही तरीके से इस्तेमाल करने के लिए, आपको तय सीमा का पालन करना होगा. इसके अलावा, लंबे समय तक चलने वाले इस तरह के जॉब में टाइमआउट और मेमोरी की सीमाओं की वजह से गड़बड़ी हो सकती है.
इस मुश्किल काम को आसान बनाने के लिए, एक टास्क क्यू फ़ंक्शन लिखा जा सकता है. यह फ़ंक्शन, scheduleTime
और dispatchDeadline
जैसे बुनियादी टास्क विकल्प सेट करता है. इसके बाद, फ़ंक्शन को Cloud Tasks में मौजूद क्यू को सौंप देता है. Cloud Tasks एनवायरमेंट को खास तौर पर इस तरह से डिज़ाइन किया गया है कि इस तरह के ऑपरेशन के लिए, भीड़ को असरदार तरीके से कंट्रोल किया जा सके और फिर से कोशिश करने की नीतियां लागू की जा सकें.
टास्क क्यू फ़ंक्शन के लिए, Cloud Functions for Firebase v3.20.1 और इसके बाद के वर्शन वाला Firebase SDK, Cloud Functions for Firebase v10.2.0 और इसके बाद के वर्शन के साथ काम करता है.Firebase Admin SDK
Firebase के साथ टास्क क्यू फ़ंक्शन का इस्तेमाल करने पर, Cloud Tasks प्रोसेसिंग के लिए शुल्क लग सकता है. ज़्यादा जानकारी के लिए, Cloud Tasks कीमत देखें.
टास्क की कतार वाले फ़ंक्शन बनाना
टास्क क्यू फ़ंक्शन इस्तेमाल करने के लिए, यह वर्कफ़्लो अपनाएं:
- Firebase SDK का इस्तेमाल करके, टास्क क्यू फ़ंक्शन लिखो.Cloud Functions
- एचटीटीपी अनुरोध के ज़रिए ट्रिगर करके, अपने फ़ंक्शन की जांच करें.
- Firebase सीएलआई की मदद से, अपने फ़ंक्शन को डिप्लॉय करें. टास्क क्यू फ़ंक्शन को पहली बार डिप्लॉय करने पर, सीएलआई Cloud Tasks में एक टास्क क्यू बनाएगा. इसमें आपके सोर्स कोड में बताए गए विकल्प (रेट लिमिट और फिर से कोशिश करना) शामिल होंगे.
- नई टास्क कतार में टास्क जोड़ें. अगर ज़रूरी हो, तो पैरामीटर पास करके टास्क के एक्ज़ीक्यूशन का शेड्यूल सेट अप करें. इसके लिए, Admin SDK का इस्तेमाल करके कोड लिखें और उसे Cloud Functions for Firebase पर डिप्लॉय करें.
टास्क क्यू फ़ंक्शन लिखना
टास्क क्यू फ़ंक्शन लिखना शुरू करने के लिए, onDispatch
का इस्तेमाल करें. टास्क क्यू फ़ंक्शन लिखने का एक अहम हिस्सा, हर क्यू के लिए फिर से कोशिश करने और दर को सीमित करने का कॉन्फ़िगरेशन सेट करना है. इस पेज पर दिए गए कोड सैंपल, ऐसे ऐप्लिकेशन पर आधारित हैं जो ऐसी सेवा सेट अप करता है जो नासा की Astronomy Picture of the Day से सभी इमेज का बैक अप लेती है:
टास्क क्यू फ़ंक्शन कॉन्फ़िगर करना
टास्क की सूची वाले फ़ंक्शन में, कॉन्फ़िगरेशन सेटिंग का एक बेहतरीन सेट होता है. इससे टास्क की सूची की दर की सीमाओं और फिर से कोशिश करने के व्यवहार को सटीक तरीके से कंट्रोल किया जा सकता है:
exports.backupApod = functions
.runWith( {secrets: ["NASA_API_KEY"]})
.tasks.taskQueue({
retryConfig: {
maxAttempts: 5,
minBackoffSeconds: 60,
},
rateLimits: {
maxConcurrentDispatches: 6,
},
}).onDispatch(async (data) => {
retryConfig.maxAttempts=5
: टास्क की कतार में मौजूद हर टास्क को, अपने-आप ज़्यादा से ज़्यादा पांच बार फिर से आज़माया जाता है. इससे नेटवर्क की गड़बड़ियों या बाहरी सेवा पर निर्भर सेवा के कुछ समय के लिए बंद होने जैसी अस्थायी गड़बड़ियों को कम करने में मदद मिलती है.retryConfig.minBackoffSeconds=60
: हर टास्क को कम से कम 60 सेकंड के बाद फिर से आज़माया जाता है. इससे हर कोशिश के बीच एक बड़ा बफ़र मिलता है, ताकि हम पांच बार कोशिश करने की सुविधा को बहुत जल्दी खत्म न कर दें.rateLimits.maxConcurrentDispatch=6
: किसी भी समय ज़्यादा से ज़्यादा छह टास्क भेजे जाते हैं. इससे यह पक्का करने में मदद मिलती है कि फ़ंक्शन को लगातार अनुरोध मिलते रहें. साथ ही, इससे चालू इंस्टेंस और कोल्ड स्टार्ट की संख्या कम करने में मदद मिलती है.
टास्क की कतार से जुड़े फ़ंक्शन की जांच करना
ज़्यादातर मामलों में, टास्क क्यू फ़ंक्शन की जांच करने के लिए Cloud Functions एम्युलेटर का इस्तेमाल करना सबसे अच्छा तरीका है. टास्क कतार फ़ंक्शन के इम्यूलेशन के लिए, अपने ऐप्लिकेशन को इंस्ट्रुमेंट करने का तरीका जानने के लिए, Emulator Suite का दस्तावेज़ देखें.
इसके अलावा, टास्क क्यू फ़ंक्शन को Firebase Local Emulator Suite में सामान्य एचटीटीपी फ़ंक्शन के तौर पर दिखाया जाता है. एचटीटीपी POST अनुरोध के साथ JSON डेटा पेलोड भेजकर, टास्क फ़ंक्शन का टेस्ट किया जा सकता है:
# start the Firebase Emulators
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
टास्क क्यू फ़ंक्शन को पहली बार डिप्लॉय करने पर, सीएलआई Cloud Tasks में एक टास्क क्यू बनाता है. इसमें आपके सोर्स कोड में बताए गए विकल्प (दर सीमित करना और फिर से कोशिश करना) शामिल होते हैं.
अगर फ़ंक्शन डिप्लॉय करते समय अनुमतियों से जुड़ी गड़बड़ियां आती हैं, तो पक्का करें कि डिप्लॉयमेंट कमांड चलाने वाले उपयोगकर्ता को सही IAM भूमिकाएं असाइन की गई हों.
टास्क की कतार वाले फ़ंक्शन को कतार में लगाना
टास्क क्यू फ़ंक्शन को Cloud Tasks में, भरोसेमंद सर्वर एनवायरमेंट जैसे कि Cloud Functions for Firebase से कतार में लगाया जा सकता है. इसके लिए, Node.js के लिए Firebase Admin SDK का इस्तेमाल करें. अगर आपने Admin SDK का इस्तेमाल पहले कभी नहीं किया है, तो किसी सर्वर में Firebase जोड़ना लेख पढ़ें.
आम तौर पर, Admin SDK एक नया टास्क बनाता है, उसे Cloud Tasks में शामिल करता है, और टास्क के लिए कॉन्फ़िगरेशन सेट करता है:
exports.enqueueBackupTasks = functions.https.onRequest(
async (_request, response) => {
const queue = getFunctions().taskQueue("backupApod");
const enqueues = [];
for (let i = 0; i <= 10; i += 1) {
// Enqueue each task with i*60 seconds delay. Our task queue function
// should process ~1 task/min.
const scheduleDelaySeconds = i * 60
enqueues.push(
queue.enqueue(
{ id: `task-${i}` },
{
scheduleDelaySeconds,
dispatchDeadlineSeconds: 60 * 5 // 5 minutes
},
),
);
}
await Promise.all(enqueues);
response.sendStatus(200);
});
scheduleDelaySeconds
: इस सैंपल कोड में, टास्क को इस तरह से शेड्यूल किया गया है कि हर टास्क के बीच कुछ समय का अंतर हो. जैसे, पहले टास्क के बाद एक मिनट का इंतज़ार, दूसरे टास्क के बाद दो मिनट का इंतज़ार, और इसी तरह आगे भी. इसका मतलब है कि हर मिनट में ~ 1 टास्क ट्रिगर होगा. ध्यान दें कि किसी टास्क को किसी खास समय पर ट्रिगर करने के लिए, Cloud Tasks के साथscheduleTime
का इस्तेमाल भी किया जा सकता है.dispatchDeadlineSeconds
: किसी टास्क के पूरा होने का इंतज़ार करने के लिए, Cloud Tasksज़्यादा से ज़्यादा समय तय करें. Cloud Tasks, टास्क को फिर से पूरा करने की कोशिश करेगा. ऐसा तब तक किया जाएगा, जब तक कि टास्क को फिर से पूरा करने के लिए कॉन्फ़िगर की गई संख्या पूरी नहीं हो जाती या यह समयसीमा खत्म नहीं हो जाती. इस सैंपल में, टास्क को पांच बार तक फिर से आज़माने के लिए, कतार को कॉन्फ़िगर किया गया है. हालांकि, अगर पूरी प्रोसेस (फिर से आज़माने की कोशिशों के साथ) में पांच मिनट से ज़्यादा समय लगता है, तो टास्क अपने-आप रद्द हो जाता है.
समस्या का हल
Cloud Tasks लॉगिंग की सुविधा चालू करना
Cloud Tasks के लॉग में, गड़बड़ी की जानकारी देने वाली काम की जानकारी होती है. जैसे, किसी टास्क से जुड़े अनुरोध की स्थिति. डिफ़ॉल्ट रूप से, Cloud Tasks से मिलने वाले लॉग बंद होते हैं. ऐसा इसलिए, क्योंकि यह आपके प्रोजेक्ट पर बड़ी संख्या में लॉग जनरेट कर सकता है. हमारा सुझाव है कि टास्क कतार के फ़ंक्शन को डेवलप और डीबग करते समय, डीबग लॉग चालू करें. लॉगिंग चालू करना लेख पढ़ें.
IAM अनुमतियां
टास्क को लाइन में लगाते समय या Cloud Tasks के टास्क कतार फ़ंक्शन को चालू करने की कोशिश करते समय, आपको PERMISSION DENIED
गड़बड़ियां दिख सकती हैं. पक्का करें कि आपके प्रोजेक्ट में ये IAM बाइंडिंग मौजूद हों:
Cloud Tasks में टास्क जोड़ने के लिए इस्तेमाल की गई पहचान के पास,
cloudtasks.tasks.create
की IAM अनुमतियां होनी चाहिए.इस सैंपल में, यह 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