Cloud Tasks की मदद से, फ़ंक्शन को सूची में जोड़ें


टास्क की सूची वाले फ़ंक्शन, Google का इस्तेमाल करते हैं क्लाउड टास्क इससे ऐप्लिकेशन को इस्तेमाल करने में समय लगता है, जिसमें ज़्यादा संसाधनों का इस्तेमाल होता है या जिसमें सीमित बैंडविथ और आपके मुख्य ऐप्लिकेशन फ़्लो के बाहर, एसिंक्रोनस रूप से काम करते हैं.

उदाहरण के लिए, मान लें कि आपको इमेज के एक बड़े सेट के बैकअप लिए जाने हैं ऐसी फ़ाइलें जो फ़िलहाल रेट लिमिट के साथ एपीआई पर होस्ट की गई हैं. बनने के लिए उस API के ज़िम्मेदार उपभोक्ता हैं, तो आपको उनकी दर सीमाओं का सम्मान करना होगा. साथ ही, टाइम आउट और टाइम आउट की वजह से, लंबे समय तक चलने वाले जॉब के फ़ेल होने का जोखिम हो सकता है मेमोरी की सीमाएं.

इस जटिलता को कम करने के लिए, आप एक टास्क सूची फ़ंक्शन लिख सकते हैं, जो बुनियादी सेट करता है scheduleTime, और dispatchDeadline जैसे टास्क के विकल्प चुने. इसके बाद, फ़ंक्शन को क्लाउड टास्क में सूची से हटाकर, दूसरी सूची में सेव करें. क्लाउड टास्क एनवायरमेंट को खास तौर पर इस तरह से डिज़ाइन किया गया है कि यह पक्का कर सके कि कंजेशन को कंट्रोल किया जा सके और इस तरह की कार्रवाइयों के लिए, फिर से कोशिश करने की कोशिश करें.

'Firebase के लिए Cloud Functions' के लिए Firebase v3.20.1 और इसके बाद के वर्शन के लिए Firebase SDK टूल के साथ Firebase एडमिन SDK v10.2.0 और इसके बाद के वर्शन का इस्तेमाल करें.

Firebase के साथ टास्क सूची वाले फ़ंक्शन का इस्तेमाल करने पर, आपको क्लाउड टास्क प्रोसेस हो रहे हैं. यहां जाएं: Cloud Tasks की कीमत से जुड़ी जानकारी हमारा वीडियो देखें.

टास्क सूची के फ़ंक्शन बनाना

टास्क सूची के फ़ंक्शन का इस्तेमाल करने के लिए, यह वर्कफ़्लो अपनाएं:

  1. Cloud Functions के लिए Firebase SDK टूल का इस्तेमाल करके, टास्क की सूची वाला फ़ंक्शन लिखें.
  2. अपने फ़ंक्शन को एचटीटीपी अनुरोध से ट्रिगर करके टेस्ट करें.
  3. अपने फ़ंक्शन को Firebase सीएलआई के साथ डिप्लॉय करें. आपके टास्क को डिप्लॉय करते समय पहली बार क्यू फ़ंक्शन का इस्तेमाल करते समय, सीएलआई क्लाउड टास्क में काम की सूची (दर को सीमित करना और फिर से कोशिश करें) विकल्प के साथ अपने सोर्स कोड में तय करें.
  4. नई बनाई गई टास्क सूची में टास्क जोड़ें. साथ ही, सेट अप करने के लिए पैरामीटर पास करें चलाने की ज़रूरत पड़ने पर, प्रोग्राम को एक्ज़ीक्यूट करने का शेड्यूल तय किया जा सकता है. कोड लिखकर ऐसा किया जा सकता है एडमिन SDK का इस्तेमाल करके और उसे 'Firebase के लिए Cloud Functions' में डिप्लॉय करने पर.

टास्क सूची के फ़ंक्शन लिखें

इस सेक्शन में दिए गए कोड सैंपल, ऐसे ऐप्लिकेशन पर आधारित हैं जो ऐसी सेवा शुरू करेगा जो नासा के आज का खगोल विज्ञान चित्र. शुरू करने के लिए, ज़रूरी मॉड्यूल इंपोर्ट करें:

Node.js

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

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

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: ज़्यादा से ज़्यादा छह टास्क इस तारीख को भेजे जाते हैं दिया गया समय. इससे यह पक्का करने में मदद मिलती है कि मौजूदा साइटों पर लगातार अनुरोध मिलते रहें यह सुविधा, ऐक्टिव इंस्टेंस और कोल्ड स्टार्ट की संख्या को कम करने में मदद करती है.

टास्क सूची के फ़ंक्शन की जांच करें

Firebase लोकल एम्युलेटर सुइट में टास्क सूची के फ़ंक्शन को आसान तरीके से दिखाया गया है एचटीटीपी फ़ंक्शन. एचटीटीपी पीओएसटी भेजकर, एम्युलेट किए गए टास्क फ़ंक्शन की जांच की जा सकती है 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 में, टास्क की सूची के फ़ंक्शन को भरोसेमंद सर्वर से जोड़ा जा सकता है Firebase के लिए Cloud Functions जैसा सर्वर एनवायरमेंट, जो Python के लिए Node.js या Google Cloud लाइब्रेरी. अगर आपने अभी तक एडमिन SDK टूल का इस्तेमाल नहीं किया है, तो शुरू करने के लिए, Firebase को सर्वर से जोड़ें.

किसी सामान्य फ़्लो की वजह से नया टास्क बन जाता है, उसे सूची में जोड़ दिया जाता है Cloud Tasks में जाकर, टास्क के लिए कॉन्फ़िगरेशन सेट करता है:

Node.js

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);
    });

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")
  • नमूना कोड Nth टास्क के लिए Nवें मिनट की देरी जोड़कर किया जाने वाला टास्क. यह जिसका मतलब है: ~ 1 टास्क/मिनट. ध्यान दें कि इस्तेमाल करने के लिए, अगर आप चाहें, तो scheduleTime (Node.js) या schedule_time (Python) क्लाउड टास्क का इस्तेमाल, किसी टास्क को तय समय पर ट्रिगर करने के लिए किया जाता है.

  • सैंपल कोड, ज़्यादा से ज़्यादा समय सेट करता है Cloud Tasks इंतज़ार करेगा पूरा करने के लिए. क्लाउड टास्क फिर से कोशिश करेंगे फिर से कोशिश करने के बाद, फिर से सेट किया गया टास्क सूची को कॉन्फ़िगर करने या इस समयसीमा तक पहुंचने तक. सैंपल में, सूची को इस तरह से कॉन्फ़िगर किया गया है कि टास्क को पांच बार तक फिर से आज़माया जा सके, लेकिन यह टास्क है अगर पूरी प्रोसेस (फिर से कोशिश करने की कोशिशों सहित) अपने-आप रद्द हो जाती है इसमें पांच मिनट से ज़्यादा लगेंगे.

टारगेट यूआरआई को वापस पाएं और शामिल करें

जिस तरीके से Cloud Tasks, पुष्टि करने के लिए पुष्टि करने वाले टोकन बनाता है किए गए टास्क सूची फ़ंक्शन को कोई अनुरोध भेजें, तो आपको टास्क की सूची में जोड़ते समय, Cloud Run फ़ंक्शन का यूआरएल. बुध की सलाह है कि आप अपने फ़ंक्शन के लिए URL को प्रोग्राम के रूप में इस रूप में पुनर्प्राप्त करें नीचे बताया गया है:

Node.js

/**
 * Get the URL of a given v2 cloud function.
 *
 * @param {string} name the function's name
 * @param {string} location the function's location
 * @return {Promise<string>} The URL of the function
 */
async function getFunctionUrl(name, location="us-central1") {
  if (!auth) {
    auth = new GoogleAuth({
      scopes: "https://www.googleapis.com/auth/cloud-platform",
    });
  }
  const projectId = await auth.getProjectId();
  const url = "https://cloudfunctions.googleapis.com/v2beta/" +
    `projects/${projectId}/locations/${location}/functions/${name}`;

  const client = await auth.getClient();
  const res = await client.request({url});
  const uri = res.data?.serviceConfig?.uri;
  if (!uri) {
    throw new Error(`Unable to retreive uri for function at ${url}`);
  }
  return uri;
}

Python

def get_function_url(name: str, location: str = SupportedRegion.US_CENTRAL1) -> str:
    """Get the URL of a given v2 cloud function.

    Params:
        name: the function's name
        location: the function's location

    Returns: The URL of the function
    """
    credentials, project_id = google.auth.default(
        scopes=["https://www.googleapis.com/auth/cloud-platform"])
    authed_session = AuthorizedSession(credentials)
    url = ("https://cloudfunctions.googleapis.com/v2beta/" +
           f"projects/{project_id}/locations/{location}/functions/{name}")
    response = authed_session.get(url)
    data = response.json()
    function_url = data["serviceConfig"]["uri"]
    return function_url

समस्या का हल

Cloud Tasks में लॉग इकट्ठा करने की सुविधा चालू करें

Cloud Tasks के लॉग में, गड़बड़ी की जानकारी से जुड़ी काम की जानकारी होती है. जैसे, टास्क से जुड़े अनुरोध की स्थिति. डिफ़ॉल्ट रूप से, से लॉग बड़ी संख्या में लॉग इस्तेमाल करने की वजह से, Cloud Tasks पर काम करने की सुविधा बंद कर दी गई है संभावित रूप से आपके प्रोजेक्ट पर जनरेट किया जा सकता है. हमारा सुझाव है कि आप डीबग लॉग चालू करें जबकि आप सक्रिय रूप से अपने टास्क सूची फ़ंक्शन को डेवलप और डीबग कर रहे हों. यहां जाएं: चालू किया जा रहा है लॉगिंग.

IAM अनुमतियां

टास्क की सूची बनाते समय या जब टास्क की सूची में यह बदलाव नहीं होता है, तो आपको PERMISSION DENIED गड़बड़ी दिख सकती है Cloud Tasks आपके टास्क सूची के फ़ंक्शन शुरू करने की कोशिश करता है. देख लें कि प्रोजेक्ट में ये IAM बाइंडिंग हैं:

  • Cloud Tasks के लिए टास्क को सूची में जोड़ने के लिए इस्तेमाल की जाने वाली पहचान cloudtasks.tasks.create आईएएम की अनुमति.

    सैंपल में, यह 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 का डिफ़ॉल्ट सेवा खाता है.

Google Cloud IAM दस्तावेज़ देखें App Engine डिफ़ॉल्ट सेवा खाता जोड़ने के तरीके से जुड़े निर्देशों के लिए App Engine डिफ़ॉल्ट सेवा खाते के उपयोगकर्ता के तौर पर.

  • टास्क क्यू फ़ंक्शन की ज़रूरतों को ट्रिगर करने के लिए इस्तेमाल की जाने वाली पहचान 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