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 gian cụ thể, 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á Linh hoạt. Nếu dự án chưa sử dụng gói Blaze, hãy nâng cấp gói giá.

Mặc dù cần phải thanh toán, nhưng bạn có thể yên tâm rằng tổng chi phí sẽ nằm trong khả năng chi trả, vì mỗi Cloud Scheduler công việc có giá 0,10 USD/tháng và mỗi Tài khoản Google được phép có 3 công việc mà không mất phí. Sử dụng công cụ tính mức giá của 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 sẽ đượ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 của Google Cloud.

Viết một hàm theo lịch

Trong Cloud Functions for Firebase, logic lập lịch nằm trong mã hàm của bạn, không có yêu cầu đặc biệt nào 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ể 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()

Cả Unix Crontab và cú pháp App Engine đều được Cloud Scheduler hỗ trợ. 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 theo lịch, một tác vụ lập lịch 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 cũng như hàm trong bảng điều khiển Google Cloud. Chủ đề đượ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ụ mặc định của Compute Engine sẽ gọi hàm HTTP được liên kết. Điều này có nghĩa là chỉ có tác vụ Cloud Scheduler được liên kết mới có quyền chạy hàm này.