使用 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 价格。
创建任务队列函数
如需使用任务队列函数,请按以下流程操作:
- 使用 Firebase SDK for Cloud Functions 编写任务队列函数。
- 使用 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 {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
