Thêm các hàm vào hàng đợi bằng Tác vụ trên đám mây


Các hàm hàng đợi tác vụ tận dụng Cloud Tasks của Google để 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 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 cho 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 số lượng yêu cầu. Để là người sử dụng có trách nhiệm của API đó, bạn cần tôn trọng giới hạn số lượng yêu cầu 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 hết thời gian chờ và giới hạn bộ nhớ.

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

SDK Firebase cho Chức năng đám mây của Firebase phiên bản 3.20.1 trở lên tương tác với SDK quản trị Firebase phiên bản 10.2.0 trở lên để hỗ trợ các chức năng hàng đợi tác vụ.

Việc sử dụng các hàm hàng đợi công việc với Firebase có thể dẫn đến việc tính phí xử lý Tác vụ trên đám mây. Xem giá của Cloud Tasks để biết thêm thông tin.

Tạo các hàm hàng đợi công việc

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

  1. Viết một hàm hàng đợi công việc bằng cách sử dụng Firebase SDK cho Chức năng đám mây.
  2. Kiểm thử hàm của bạn bằng cách kích hoạt hàm đó bằng một yêu cầu HTTP.
  3. Triển khai chức năng bằng Giao diện dòng lệnh (CLI) của Firebase. Khi triển khai chức năng hàng đợi tác vụ của bạn 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 tốc độ và thử lại) được chỉ định trong mã nguồn của bạn.
  4. Thêm 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ể làm được điều này bằng cách viết mã bằng SDK dành cho quản trị viên và triển khai mã đó trên Cloud Functions cho Firebase.

Viết hàm hàng đợi công việc

Sử dụng onDispatch để bắt đầu viết các hàm hàng đợi công việc. Một phần quan trọng khi viết hàm hàng đợi tác vụ là đặt thử lại trong mỗi hàng đợi và cấu hình giới hạn tốc độ. Mã mẫu trong trang này dựa trên một ứng dụng thiết lập dịch vụ sao lưu tất cả hình ảnh trong Bức ảnh thiên văn trong ngày của NASA:

Định cấu hình hàm hàng đợi công việc

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 tốc độ và hành vi thử lại của 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ẽ được tự động 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ụ phụ thuộc bên ngoài.
  • retryConfig.minBackoffSeconds=60: Mỗi nhiệm vụ sẽ được thử lại ít nhất 60 giây sau mỗi lần thử. Điều này cung cấp một khoảng đệm lớn giữa mỗi lần thử, vì vậy, chúng ta không nên vội vàng kết thúc 5 lần thử lại quá nhanh.
  • rateLimits.maxConcurrentDispatch=6: Tối đa 6 tác vụ được gửi tại một thời điểm nhất định. Điều này giúp đảm bảo một luồng yêu cầu ổn định đến hàm cơ bản, đồng thời 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 công việc

Các hàm hàng đợi công việc trong Bộ công cụ mô phỏng cục bộ của Firebase hiển thị dưới dạng các hàm HTTP đơn giản. Bạn có thể kiểm thử hàm tác vụ được mô phỏng bằng cách gửi yêu cầu POST HTTP 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 công việc

Triển khai hàm hàng đợi công việc bằng Giao diện dòng lệnh (CLI) của Firebase:

$ firebase deploy --only functions:backupApod

Khi triển khai hàm hàng đợi công việc 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 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 bạn đã chỉ định các vai trò IAM thích hợp cho người dùng đang chạy lệnh triển khai.

Thêm các hàm của hàng đợi công việc vào hàng đợi

Các chức năng của hàng đợi công việc có thể được đưa vào hàng đợi trong Tác vụ trên đám mây từ một môi trường máy chủ đáng tin cậy, chẳng hạn như Cloud Functions cho Firebase bằng cách sử dụng SDK quản trị của Firebase cho Node.js. Nếu bạn mới sử dụng SDK dành cho quản trị viên, hãy xem bài viết Thêm Firebase vào máy chủ để bắt đầu.

Trong một quy trình thông thường, SDK dành cho quản trị viên sẽ tạo một tác vụ mới, đưa tác vụ đó vào hàng đợi trong Tác vụ trên đám mây và đặt 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 mở rộng quá trình thực thi các tác vụ bằng cách liên kết độ trễ của phút thứ N cho tác vụ thứ N. Việc này sẽ kích hoạt ~ 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ụ tại một thời điểm cụ thể.
  • dispatchDeadlineSeconds: Khoảng thời gian tối đa Cloud Tasks sẽ đợi 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 này, 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ộ quá 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ý tác vụ trên đám mây

Nhật ký của Cloud Tasks chứa các thông tin chẩn đoán hữu ích như trạng thái yêu cầu liên kết với một nhiệm vụ. Theo mặc định, nhật ký của Cloud Tasks sẽ bị tắt do có thể tạo ra lượng lớn nhật ký trên dự án của bạn. Bạn nên bật nhật ký gỡ lỗi trong khi đang tích cực phát triển và gỡ lỗi các hàm trong 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 đưa các tác vụ vào hàng đợi hoặc khi Cloud Tasks cố gắng gọi các hàm trong hàng đợi công việc. Hãy đảm bảo rằng dự án của bạn có các liên kết IAM sau đây:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer

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

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