Xếp hàng các hàm bằng Cloud Tasks (thế hệ thứ nhất)

Các hàm hàng đợi tác vụ tận dụng Google Cloud Tasks để giúp ứng dụng của bạn chạy các tác vụ tốn thời gian, tốn nhiều tài nguyên hoặc bị giới hạn băng thông một cách không đồng bộ, bên ngoài luồng ứng dụng chính.

Ví dụ: giả sử bạn muốn tạo bản sao lưu của một tập hợp lớn các tệp hình ảnh hiện được lưu trữ trên một API có giới hạn về tốc độ. Để trở thành người tiêu dùng có trách nhiệm của API đó, bạn cần tuân thủ các giới hạn về tốc độ của họ. Ngoài ra, loại công việc chạy trong thời gian dài này có thể dễ bị lỗi do thời gian chờ và giới hạn bộ nhớ.

Để giảm bớt sự phức tạp này, bạn có thể viết một hàm hàng đợi tác vụ đặt các tuỳ chọn tác vụ cơ bản tác vụ như scheduleTime, và dispatchDeadline, sau đó chuyển hàm này sang một hàng đợi trong Cloud Tasks. Môi trường được thiết kế riêng để đảm bảo kiểm soát hiệu quả tình trạng tắc nghẽn và các chính sách thử lại cho những loại hoạt động này.Cloud Tasks

Firebase SDK cho Cloud Functions for Firebase phiên bản 3.20.1 trở lên tương tác với Firebase Admin SDK phiên bản 10.2.0 trở lên để hỗ trợ các hàm hàng đợi tác vụ.

Việc sử dụng các hàm hàng đợi tác vụ với Firebase có thể dẫn đến các khoản phí xử lý Cloud Tasks. Hãy xem phần Cloud Tasks giá để biết thêm thông tin.

Tạo hàm hàng đợi tác vụ

Để sử dụng các hàm hàng đợi tác vụ, hãy làm theo quy trình công việc sau:

  1. Viết hàm hàng đợi tác vụ bằng Firebase SDK cho Cloud Functions.
  2. Kiểm thử hàm bằng cách kích hoạt hàm đó bằng một yêu cầu HTTP.
  3. Triển khai hàm bằng Firebase CLI. Khi triển khai hàm hàng đợi tác vụ lần đầu tiên, CLI sẽ tạo một hàng đợi tác vụ trong Cloud Tasks với các tuỳ chọn (giới hạn về tốc độ và thử lại) được chỉ định trong mã nguồn của bạn.
  4. Thêm các tác vụ vào hàng đợi tác vụ mới tạo, truyền các tham số để thiết lập lịch thực thi nếu cần. Bạn có thể thực hiện việc này bằng cách viết mã bằng Admin SDK và triển khai mã đó vào Cloud Functions for Firebase.

Viết hàm hàng đợi tác vụ

Sử dụng onDispatch để bắt đầu viết các hàm hàng đợi tác vụ. Một phần quan trọng của việc viết hàm hàng đợi tác vụ là thiết lập cấu hình thử lại và giới hạn về tốc độ cho mỗi hàng đợi. Các mẫu mã trên trang này dựa trên một ứng dụng thiết lập một dịch vụ sao lưu tất cả hình ảnh từ Astronomy Picture of the Day (Ảnh thiên văn trong ngày) của NASA:

Định cấu hình các hàm hàng đợi tác vụ

Các hàm hàng đợi tác vụ đi kèm với một tập hợp mạnh mẽ các chế độ cài đặt cấu hình để kiểm soát chính xác giới hạn về tốc độ và hành vi thử lại của một hàng đợi tác vụ:

exports.backupApod = functions
    .runWith( {secrets: ["NASA_API_KEY"]})
    .tasks.taskQueue({
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }).onDispatch(async (data) => {
  • retryConfig.maxAttempts=5: Mỗi tác vụ trong hàng đợi tác vụ sẽ tự động được thử lại tối đa 5 lần. Điều này giúp giảm thiểu các lỗi tạm thời như lỗi mạng hoặc gián đoạn dịch vụ tạm thời của một dịch vụ bên ngoài, phụ thuộc.
  • retryConfig.minBackoffSeconds=60: Mỗi tác vụ được thử lại cách nhau ít nhất 60 giây giữa mỗi lần thử. Điều này cung cấp một vùng đệm lớn giữa mỗi lần thử để chúng ta không vội sử dụng hết 5 lần thử lại quá nhanh.
  • rateLimits.maxConcurrentDispatch=6: Tại một thời điểm nhất định, tối đa 6 tác vụ được gửi đi. Điều này giúp đảm bảo luồng yêu cầu ổn định cho hàm cơ bản và giúp giảm số lượng thực thể đang hoạt động và số lần khởi động nguội.

Kiểm thử các hàm hàng đợi tác vụ

Trong hầu hết các trường hợp, trình mô phỏng Cloud Functions là cách tốt nhất để kiểm thử các hàm hàng đợi tác vụ. Hãy xem tài liệu về Bộ công cụ mô phỏng để tìm hiểu cách gắn mã theo dõi ứng dụng của bạn để mô phỏng các hàm hàng đợi tác vụ.

Ngoài ra, các hàm hàng đợi tác vụ được hiển thị dưới dạng các hàm HTTP đơn giản trong Firebase Local Emulator Suite. Bạn có thể kiểm thử một hàm tác vụ được mô phỏng bằng cách gửi yêu cầu HTTP POST với tải trọng dữ liệu json:

 # start the Firebase Emulators
 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

Triển khai các hàm hàng đợi tác vụ

Triển khai hàm hàng đợi tác vụ bằng Firebase CLI:

$ firebase deploy --only functions:backupApod

Khi triển khai hàm hàng đợi tác vụ lần đầu tiên, CLI sẽ tạo một hàng đợi tác vụ trong Cloud Tasks với các tuỳ chọn (giới hạn về tốc độ và thử lại) được chỉ định trong mã nguồn của bạn.

Nếu bạn gặp lỗi về quyền khi triển khai các hàm, hãy đảm bảo rằng các vai trò IAM thích hợp được chỉ định cho người dùng chạy các lệnh triển khai.

Xếp hàng các hàm hàng đợi tác vụ

Các hàm hàng đợi tác vụ có thể được xếp hàng trong Cloud Tasks từ một môi trường máy chủ đáng tin cậy như Cloud Functions for Firebase bằng Firebase Admin SDK cho Node.js. Nếu bạn mới sử dụng Admin SDKs, hãy xem Thêm Firebase vào máy chủ để bắt đầu.

Trong một luồng thông thường, Admin SDK sẽ tạo một tác vụ mới, xếp hàng tác vụ đó trong Cloud Tasks, và thiết lập cấu hình cho tác vụ:

exports.enqueueBackupTasks = functions.https.onRequest(
async (_request, response) => {
  const queue = getFunctions().taskQueue("backupApod");
  const enqueues = [];
  for (let i = 0; i <= 10; i += 1) {
    // Enqueue each task with i*60 seconds delay. Our task queue function
    // should process ~1 task/min.
    const scheduleDelaySeconds = i * 60 
    enqueues.push(
        queue.enqueue(
          { id: `task-${i}` },
          {
            scheduleDelaySeconds,
            dispatchDeadlineSeconds: 60 * 5 // 5 minutes
          },
        ),
    );
  }
  await Promise.all(enqueues);
  response.sendStatus(200);

});
  • scheduleDelaySeconds: Mã mẫu cố gắng phân tán việc thực thi các tác vụ bằng cách liên kết độ trễ N phút cho tác vụ thứ N. Điều này chuyển thành việc kích hoạt khoảng 1 tác vụ/phút. Xin lưu ý rằng bạn cũng có thể sử dụng scheduleTime nếu muốn Cloud Tasks kích hoạt một tác vụ vào một thời điểm cụ thể.
  • dispatchDeadlineSeconds: Khoảng thời gian tối đa mà Cloud Tasks sẽ chờ một tác vụ hoàn tất. Cloud Tasks sẽ thử lại tác vụ theo cấu hình thử lại của hàng đợi hoặc cho đến khi đạt đến thời hạn này. Trong mẫu, hàng đợi được định cấu hình để thử lại tác vụ tối đa 5 lần, nhưng tác vụ sẽ tự động bị huỷ nếu toàn bộ quy trình (bao gồm cả các lần thử lại) mất hơn 5 phút.

Khắc phục sự cố

Bật tính năng ghi nhật ký Cloud Tasks

Nhật ký từ Cloud Tasks chứa thông tin chẩn đoán hữu ích như trạng thái của yêu cầu được liên kết với một tác vụ. Theo mặc định, nhật ký từ Cloud Tasks sẽ tắt do khối lượng nhật ký lớn mà nhật ký này có thể tạo trên dự án của bạn. Bạn nên bật nhật ký gỡ lỗi khi đang tích cực phát triển và gỡ lỗi các hàm hàng đợi tác vụ. Xem phần Bật tính năng ghi nhật ký.

Quyền IAM

Bạn có thể thấy lỗi PERMISSION DENIED khi xếp hàng các tác vụ hoặc khi Cloud Tasks cố gắng gọi các hàm hàng đợi tác vụ. Đảm bảo rằng dự án của bạn có các liên kết IAM sau:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • Tài khoản nhận dạng được dùng để xếp hàng các tác vụ vào Cloud Tasks cần có quyền sử dụng tài khoản dịch vụ được liên kết với một tác vụ trong Cloud Tasks.

    Trong mẫu, đây là App Engine tài khoản dịch vụ mặc định.

Hãy xem tài liệu về Cloud IAM của Google để biết hướng dẫn về cách thêm tài khoản dịch vụ mặc định làm người dùng của tài khoản dịch vụ mặc định.App EngineApp Engine

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker