使用 Cloud Tasks 将函数加入队列

任务队列函数充分利用 Google Cloud Tasks 来帮助您的应用在主应用流之外异步运行耗时、资源密集型或带宽受限的任务。

例如,假设您想要为当前通过某个 API 托管的大量图片文件创建备份,但该 API 设有速率限制。为了负责任地使用该 API,您需要遵循其速率限制。此外,由于超时和内存限制,这种长时间运行的作业可能很容易发生错误。

为了降低这种复杂性,您可以编写一个任务队列函数来设置 scheduleTime 和 dispatchDeadline 等基本任务选项,然后将该函数传递到 Cloud Tasks 中的某个队列。Cloud Tasks 环境经过特别设计,可确保针对此类操作实现有效的拥塞控制和重试政策。

Firebase SDK for Cloud Functions for Firebase v3.20.1 及更高版本可与 Firebase Admin SDK v10.2.0 及更高版本进行交互,以支持任务队列函数。

在 Firebase 中使用任务队列函数可能会产生 Cloud Tasks 处理费用。如需了解详情,请参阅 Cloud Tasks 价格。

创建任务队列函数

如需使用任务队列函数,请按以下流程操作:

  1. 使用 Firebase SDK for Cloud Functions 编写任务队列函数。
  2. 使用 HTTP 请求触发您的函数,以测试该函数。
  3. 使用 Firebase CLI 部署您的函数。首次部署任务队列函数时,CLI 会在 Cloud Tasks 中创建一个采用源代码中指定的选项(速率限制和重试)的任务队列。
  4. 将任务添加到新建的任务队列中,并传递参数以设置执行时间(如果需要)。您可以使用 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 {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");

index.js

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

main

.py