Hàm lên lịch


Nếu bạn muốn lên lịch chạy các hàm vào thời điểm chỉ định, hãy sử dụng trình xử lý onSchedule do firebase-functions/v2/scheduler cung cấp. Các hàm này sử dụng Cloud Scheduler để gọi logic hàm tại thời điểm hoặc khoảng thời gian mà bạn xác định.

Trước khi bắt đầu

Để sử dụng giải pháp này trong dự án Firebase, dự án của bạn phải sử dụng gói giá Gói linh hoạt. Nếu ứng dụng chưa sử dụng gói Blaze, hãy nâng cấp gói giá.

Mặc dù phải thanh toán, nhưng bạn có thể kiểm soát được chi phí tổng thể vì mỗi công việc Cloud Scheduler có giá 0,10 đô la Mỹ mỗi tháng và mỗi Tài khoản Google được phép thực hiện 3 công việc mà không mất phí. Sử dụng máy tính giá Blaze để tạo chi phí ước tính dựa trên mức sử dụng dự kiến của bạn.

Bạn phải bật API Cloud Scheduler cho dự án của mình. Tính năng này phải được bật cho hầu hết các dự án Firebase; bạn có thể xác minh trong bảng điều khiển Google Cloud.

Viết hàm được lên lịch

Trong Cloud Functions for Firebase, logic lên lịch nằm trong mã hàm của bạn, không có yêu cầu đặc biệt về thời gian triển khai. Ví dụ: để dọn dẹp các tài khoản người dùng không hoạt động mỗi ngày một lần, bạn có thể viết một hàm bắt đầu bằng các câu lệnh nhập sau:

Node.js

// The Cloud Functions for Firebase SDK to set up triggers and logging.
const {onSchedule} = require("firebase-functions/v2/scheduler");
const {logger} = require("firebase-functions");

// The Firebase Admin SDK to delete inactive users.
const admin = require("firebase-admin");
admin.initializeApp();

// The es6-promise-pool to limit the concurrency of promises.
const PromisePool = require("es6-promise-pool").default;
// Maximum concurrent account deletions.
const MAX_CONCURRENT = 3;

Python

# The Cloud Functions for Firebase SDK to set up triggers and logging.
from firebase_functions import scheduler_fn

# The Firebase Admin SDK to delete users.
import firebase_admin
from firebase_admin import auth

firebase_admin.initialize_app()

Sau đó, bạn có thể sử dụng onSchedule để bắt đầu một tác vụ Cloud Scheduler:

Node.js

// Run once a day at midnight, to clean up the users
// Manually run the task here https://console.cloud.google.com/cloudscheduler
exports.accountcleanup = onSchedule("every day 00:00", async (event) => {
  // Fetch all user details.
  const inactiveUsers = await getInactiveUsers();

  // Use a pool so that we delete maximum `MAX_CONCURRENT` users in parallel.
  const promisePool = new PromisePool(
      () => deleteInactiveUser(inactiveUsers),
      MAX_CONCURRENT,
  );
  await promisePool.start();

  logger.log("User cleanup finished");
});

Python

# Run once a day at midnight, to clean up inactive users.
# Manually run the task here https://console.cloud.google.com/cloudscheduler
@scheduler_fn.on_schedule(schedule="every day 00:00")
def accountcleanup(event: scheduler_fn.ScheduledEvent) -> None:
    """Delete users who've been inactive for 30 days or more."""
    user_page: auth.ListUsersPage | None = auth.list_users()
    while user_page is not None:
        inactive_uids = [
            user.uid for user in user_page.users if is_inactive(user, timedelta(days=30))
        ]
        auth.delete_users(inactive_uids)
        user_page = user_page.get_next_page()

Cloud Scheduler hỗ trợ cả cú pháp Unix Crontab và App Engine. Ví dụ: để sử dụng Crontab, hãy làm như sau:

Node.js

exports.scheduledFunctionCrontab = onSchedule("5 11 * * *", async (event) => {
  // ...
});

Python

@scheduler_fn.on_schedule(schedule="5 11 * * *")

Triển khai hàm theo lịch

Khi bạn triển khai một hàm được lên lịch, một công việc của trình lập lịch biểu và một hàm HTTP sẽ tự động được tạo. CLI Firebase sẽ lặp lại tên hàm và bạn có thể xem công việc và hàm này trong bảng điều khiển Google Cloud. Chủ đề này được đặt tên theo quy ước sau:

firebase-schedule-function_name-region

Ví dụ:

firebase-schedule-accountcleanup-us-east1.

Vào thời gian đã lên lịch, tài khoản dịch vụ điện toán mặc định sẽ gọi hàm HTTP được liên kết. Điều này có nghĩa là chỉ công việc Cloud Scheduler liên kết mới có quyền chạy hàm.