Chức năng hàng đợi tác vụ tận dụng Google Cloud Tasks để giúp ứng dụng của bạn chạy tốn thời gian, tốn nhiều tài nguyên hoặc có giới hạn băng thông các nhiệm vụ một cách không đồng bộ, bên ngoài luồng ứng dụng chính của bạn.
Ví dụ: giả sử bạn muốn tạo bản sao lưu cho một tập hợp lớn hình ảnh các tệp hiện được lưu trữ trên API có giới hạn tốc độ. Để trở thành người tiêu 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ọ. Hơn nữa, 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 tác vụ đặt cơ bản
các tuỳ chọn tác vụ như scheduleTime
và dispatchDeadline
, sau đó chuyển đến
vào một hàng đợi trong Cloud Tasks. Cloud Tasks
đượ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à
thử lại chính sách cho các loại thao tác này.
Firebase SDK dành cho Cloud Functions for Firebase phiên bản 3.20.1 trở lên có khả năng tương tác cao hơn với Firebase Admin SDK 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 tác vụ với Firebase có thể dẫn đến việc tính phí Đang xử lý yêu cầu Cloud Tasks. Xem Giá Cloud Tasks để biết thêm thông tin.
Tạo hàm cho hàng đợi tác vụ
Để sử dụng các hàm của hàng đợi tác vụ, hãy làm theo quy trình sau:
- Viết một hàm hàng đợi công việc bằng cách sử dụng SDK Firebase cho Cloud Functions.
- Kiểm tra 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.
- Triển khai hàm bằng CLI Firebase. Khi triển khai tác vụ lần đầu tiên, CLI sẽ tạo một hàng đợi công việc trong Cloud Tasks với các tùy chọn (giới hạn tốc độ và thử lại) được chỉ định trong mã nguồn của bạn.
- Thêm công việc vào hàng đợi công việc mới tạo, chuyể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 điều này bằng cách viết mã bằng cách sử dụng Admin SDK và triển khai cho Cloud Functions for Firebase.
Ghi 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 quan trọng
một phần của việc viết hàm hàng đợi tác vụ là đặt lần thử lại cho mỗi hàng đợi và đánh giá
cấu hình hạn chế. Mã mẫu trong trang này dựa trên một ứng dụng đặt
sao lưu tất cả hình ảnh từ
Ảnh thiên văn học trong ngày:
Định cấu hình các hàm của hàng đợi tác vụ
Các chức năng của hàng đợi tác vụ đi kèm với một tập hợp các cài đặt cấu hình mạnh mẽ để kiểm soát chính xác giới hạn số lượng yêu cầu và thử lại hành vi 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 việc cần làm trong hàng đợi tác vụ sẽ tự động đã thử lại tối đa 5 lần. Việc này giúp giảm thiểu các lỗi tạm thời, chẳng hạn như lỗi mạng lỗi 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 việc cần làm sẽ được thử lại sau ít nhất 60 giây ngoài mỗi lần thử. Thao tác này cung cấp một vùng đệm lớn giữa mỗi lần thử vì vậy, chúng ta không phải vội vã thử hết 5 lần thử lại quá nhanh.rateLimits.maxConcurrentDispatch=6
: Tối đa 6 công việc được gửi đi tại một thời gian nhất định. Điều này giúp đảm bảo luồng yêu cầu ổn định đến đồng thời giúp giảm số lượng thực thể đang hoạt động cũng như số lượt khởi động nguội.
Kiểm thử hàm của hàng đợi tác vụ
Đối với 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ử tác vụ các hàm hàng đợi. Xem tài liệu về Bộ mô phỏng để tìm hiểu cách đo lường ứ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 biểu thị dưới dạng đơn giản Các hàm HTTP trong Firebase Local Emulator Suite. Bạn có thể kiểm thử một chức năng tác vụ được mô phỏng bằng cách gửi một yêu cầu POST qua HTTP yêu cầu có 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 chức năng của hàng đợi tác vụ
Triển khai chức năng hàng đợi tác vụ bằng cách sử dụng Giao diện dòng lệnh (CLI) của Firebase:
$ firebase deploy --only functions:backupApod
Trong lần đầu triển khai chức năng hàng đợi tác vụ, 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 mình.
Nếu bạn gặp phải lỗi về quyền khi triển khai các chức năng, hãy đảm bảo rằng các vai trò quản lý danh tính và quyền truy cập (IAM) thích hợp được chỉ định cho người dùng chạy lệnh triển khai.
Thêm các hàm hàng đợi tác vụ vào hàng đợi
Các hàm hàng đợi tác vụ có thể được thêm vào hàng đợi từ một ứng dụng đáng tin cậy trong Cloud Tasks môi trường máy chủ như Cloud Functions for Firebase bằng cách sử dụng Firebase Admin SDK cho Node.js. Nếu bạn mới sử dụng Admin SDK, hãy xem Thêm Firebase vào máy chủ để bắt đầu.
Theo quy trình thông thường, Admin SDK sẽ tạo một tác vụ mới rồi đưa tác vụ đó vào hàng đợi Cloud Tasks rồi đặ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ủa nhiệm vụ bằng cách liên kết độ trễ ở phút thứ N cho nhiệm vụ thứ N. Chiến dịch này đồng nghĩa với việc kích hoạt khoảng 1 nhiệm vụ/phút. Xin lưu ý rằng bạn cũng có thể sử dụngscheduleTime
nếu bạn muốn Cloud Tasks kích hoạt một việc cần làm vào thời điểm cụ thể.dispatchDeadlineSeconds
: Khoảng thời gian tối đa Cloud Tasks sẽ đợi để hoàn thành một nhiệm vụ. Cloud Tasks sẽ thử lại tác vụ sau lần thử lại cấu hình 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ộ 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ố
Cloud Tasks">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 công việc. Theo mặc định, nhật ký từ Cloud Tasks đã bị tắt do khối lượng lớn nhật ký mà nó có thể có thể tạo ra trong dự án của bạn. Bạn nên bật nhật ký gỡ lỗi trong khi bạn vẫn đang tích cực phát triển và gỡ lỗi các chức năng hàng đợi tác vụ. Xem Bật ghi nhật ký.
Quyền quản lý danh tính và quyền truy cập (IAM)
Bạn có thể gặp lỗi PERMISSION DENIED
khi thêm việc cần làm vào hàng đợi hoặc khi
Cloud Tasks cố gọi các hàm hàng đợi tác vụ của bạn. Đảm bảo rằng các thuộc tính
dự án có các mối liên kết IAM sau đây:
Danh tính dùng để thêm các tác vụ vào hàng đợi vào Cloud Tasks cần Quyền quản lý danh tính và quyền truy cập (IAM)
cloudtasks.tasks.create
.Trong mẫu, đây là tài khoản dịch vụ mặc định App Engine
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudtasks.enqueuer
Danh tính dùng để thêm các công việc vào hàng đợi 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 công việc trong Cloud Tasks.
Trong mẫu, đây là tài khoản dịch vụ mặc định App Engine.
Xem tài liệu về Google Cloud IAM để xem 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 App Engine.
Danh tính dùng để kích hoạt chức năng hàng đợi tác vụ cần Quyền
cloudfunctions.functions.invoke
.Trong mẫu, đây là tài khoản dịch vụ mặc định App Engine
gcloud functions add-iam-policy-binding $FUNCTION_NAME \
--region=us-central1 \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudfunctions.invoker