ฟังก์ชันคิวของงานใช้ประโยชน์จาก Google Cloud Tasks เพื่อช่วยให้แอปของคุณเรียกใช้งานที่ใช้เวลานาน ใช้ทรัพยากรมาก หรือมีแบนด์วิดท์จำกัด แบบไม่พร้อมกันภายนอกโฟลว์แอปพลิเคชันหลัก
เช่น สมมติว่าคุณต้องการสร้างข้อมูลสำรองของชุดไฟล์รูปภาพขนาดใหญ่ที่โฮสต์อยู่ใน API ที่มีขีดจำกัดอัตรา คุณต้องเคารพขีดจำกัดอัตราของ API นั้นเพื่อให้เป็นผู้ใช้ API ที่มีความรับผิดชอบ นอกจากนี้ งานที่ใช้เวลานานเช่นนี้อาจเสี่ยงต่อการล้มเหลวเนื่องจากหมดเวลาและ ขีดจำกัดของหน่วยความจำ
คุณสามารถเขียนฟังก์ชันคิวของงานเพื่อตั้งค่าตัวเลือกงานพื้นฐาน เช่น scheduleTime
และ dispatchDeadline
แล้วส่งต่อฟังก์ชันไปยังคิวใน Cloud Tasks เพื่อลดความซับซ้อนนี้ Cloud Tasks
สภาพแวดล้อมได้รับการออกแบบมาโดยเฉพาะเพื่อให้มั่นใจว่าการควบคุมความแออัดและ
นโยบายการลองใหม่มีประสิทธิภาพสำหรับการดำเนินการประเภทนี้
Firebase SDK สำหรับ Cloud Functions for Firebase v3.20.1 ขึ้นไปทำงานร่วมกับ Firebase Admin SDK v10.2.0 ขึ้นไปเพื่อรองรับฟังก์ชันคิวงาน
การใช้ฟังก์ชันคิวงานกับ Firebase อาจทำให้เกิดค่าใช้จ่ายสำหรับ Cloud Tasks การประมวลผล ดูข้อมูลเพิ่มเติมได้ที่ Cloud Tasksการกำหนดราคา
สร้างฟังก์ชันคิวของงาน
หากต้องการใช้ฟังก์ชันคิวของงาน ให้ทำตามเวิร์กโฟลว์ต่อไปนี้
- เขียนฟังก์ชันคิวงานโดยใช้ Firebase SDK สำหรับ Cloud Functions
- ทดสอบฟังก์ชันโดยทริกเกอร์ด้วยคำขอ HTTP
- ทำให้ฟังก์ชันใช้งานได้ด้วย Firebase CLI เมื่อทําให้ฟังก์ชันคิวงานใช้งานได้เป็นครั้งแรก CLI จะสร้างคิวงานใน Cloud Tasks พร้อมตัวเลือก (การจํากัดอัตราและการลองใหม่) ที่ระบุไว้ในซอร์สโค้ด
- เพิ่มงานลงในคิวงานที่สร้างขึ้นใหม่ โดยส่งพารามิเตอร์เพื่อตั้งค่า กำหนดการดำเนินการหากจำเป็น คุณทำได้โดยเขียนโค้ด โดยใช้ Admin SDK และนำไปใช้งานใน Cloud Functions for Firebase
เขียนฟังก์ชันคิวงาน
ใช้ onDispatch
เพื่อเริ่มต้นเขียนฟังก์ชันคิวของงาน ส่วนสำคัญของการเขียนฟังก์ชันคิวงานคือการกำหนดค่าการลองใหม่และอัตราการจำกัดต่อคิว
ตัวอย่างโค้ดในหน้านี้อิงตามแอปที่ตั้งค่า
บริการที่สำรองข้อมูลรูปภาพทั้งหมดจากภาพดาราศาสตร์ประจำวันของ NASA
กำหนดค่าฟังก์ชันคิวของงาน
ฟังก์ชันคิวงานมาพร้อมชุดการตั้งค่าการกำหนดค่าที่มีประสิทธิภาพ เพื่อควบคุมขีดจํากัดอัตราและลักษณะการทํางานของการลองใหม่ของคิวงานได้อย่างแม่นยํา
exports.backupApod = functions
.runWith( {secrets: ["NASA_API_KEY"]})
.tasks.taskQueue({
retryConfig: {
maxAttempts: 5,
minBackoffSeconds: 60,
},
rateLimits: {
maxConcurrentDispatches: 6,
},
}).onDispatch(async (data) => {
retryConfig.maxAttempts=5
: ระบบจะลองส่งงานแต่ละรายการในคิวงานอีกครั้งโดยอัตโนมัติ สูงสุด 5 ครั้ง ซึ่งจะช่วยลดข้อผิดพลาดชั่วคราว เช่น ข้อผิดพลาดของเครือข่าย หรือการหยุดชะงักของบริการชั่วคราวของบริการภายนอกที่ขึ้นอยู่กับบริการนี้retryConfig.minBackoffSeconds=60
: ระบบจะลองทำงานแต่ละอย่างอีกครั้งโดยเว้นระยะห่างจากการลองครั้งก่อนอย่างน้อย 60 วินาที ซึ่งจะช่วยให้มีช่วงเวลาพักระหว่างการพยายามแต่ละครั้ง เราจึงไม่ต้องรีบใช้ความพยายามในการลองใหม่ 5 ครั้งเร็วเกินไปrateLimits.maxConcurrentDispatch=6
: ระบบจะจ่ายงานสูงสุด 6 งานในเวลาที่กำหนด ซึ่งจะช่วยให้มั่นใจได้ว่าจะมีคำขอไปยังฟังก์ชันพื้นฐานอย่างต่อเนื่อง และช่วยลดจำนวนอินสแตนซ์ที่ใช้งานอยู่และ Cold Start
ทดสอบฟังก์ชันคิวงาน
ในกรณีส่วนใหญ่ Cloud Functionsโปรแกรมจำลองเป็นวิธีที่ดีที่สุดในการทดสอบฟังก์ชันคิวของงาน ดูเอกสารประกอบของ Emulator Suite เพื่อดูวิธีวัดประสิทธิภาพแอปสำหรับการจำลองฟังก์ชันคิวของงาน
นอกจากนี้ ฟังก์ชันคิวของงานยังแสดงเป็นฟังก์ชัน HTTP แบบง่ายใน Firebase Local Emulator Suite คุณสามารถทดสอบฟังก์ชันงานที่จำลองได้โดยส่งคำขอ HTTP POST พร้อมเพย์โหลดข้อมูล 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
ทำให้ฟังก์ชันคิวงานใช้งานได้
ทำให้ฟังก์ชันคิวของงานใช้งานได้โดยใช้ Firebase CLI โดยทำดังนี้
$ firebase deploy --only functions:backupApod
เมื่อทําให้ฟังก์ชันคิวงานใช้งานได้เป็นครั้งแรก CLI จะสร้างคิวงานใน Cloud Tasks พร้อมตัวเลือก (การจํากัดอัตราและการลองใหม่) ที่ระบุไว้ในซอร์สโค้ด
หากพบข้อผิดพลาดเกี่ยวกับสิทธิ์เมื่อติดตั้งใช้งานฟังก์ชัน ให้ตรวจสอบว่าได้มอบหมายบทบาท IAM ที่เหมาะสม ให้กับผู้ใช้ที่เรียกใช้คำสั่งการติดตั้งใช้งานแล้ว
จัดคิวฟังก์ชันคิวงาน
ฟังก์ชันคิวของงานสามารถจัดคิวใน Cloud Tasks จากสภาพแวดล้อมของเซิร์ฟเวอร์ที่เชื่อถือได้ เช่น Cloud Functions for Firebase โดยใช้ Firebase Admin SDK สำหรับ Node.js หากคุณเพิ่งเริ่มใช้ Admin SDK โปรดดูหัวข้อ เพิ่ม Firebase ลงในเซิร์ฟเวอร์เพื่อเริ่มต้นใช้งาน
ในโฟลว์ทั่วไป Admin SDK จะสร้างงานใหม่ จัดคิวใน Cloud Tasks และตั้งค่าสำหรับงาน ดังนี้
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
: โค้ดตัวอย่างพยายามกระจายการดำเนินการของ งานโดยเชื่อมโยงการหน่วงเวลาเป็นเวลา N นาทีสำหรับงานที่ N ซึ่งหมายถึงการทริกเกอร์งานประมาณ 1 งาน/นาที โปรดทราบว่าคุณยังใช้scheduleTime
ได้ด้วยหากต้องการให้ Cloud Tasks เรียกใช้ งานในเวลาที่เฉพาะเจาะจงdispatchDeadlineSeconds
: ระยะเวลาสูงสุดที่ Cloud Tasks จะรอ ให้งานเสร็จสมบูรณ์ Cloud Tasks จะลองทำงานอีกครั้งตามการกำหนดค่าการลองใหม่ของคิว หรือจนกว่าจะถึงกำหนดเวลานี้ ในตัวอย่าง คิวได้รับการกำหนดค่าให้ลองทำงานอีกครั้งได้สูงสุด 5 ครั้ง แต่ระบบจะ ยกเลิกงานโดยอัตโนมัติหากกระบวนการทั้งหมด (รวมถึงการพยายามลองอีกครั้ง) ใช้เวลานานกว่า 5 นาที
การแก้ปัญหา
เปิดการบันทึก Cloud Tasks
บันทึกจาก Cloud Tasks มีข้อมูลการวินิจฉัยที่เป็นประโยชน์ เช่น สถานะของคำขอที่เชื่อมโยงกับงาน โดยค่าเริ่มต้น ระบบจะปิดบันทึกจาก Cloud Tasks เนื่องจากบันทึกจำนวนมากที่อาจสร้างขึ้นในโปรเจ็กต์ เราขอแนะนำให้คุณเปิดบันทึกการแก้ไขข้อบกพร่อง ขณะที่กำลังพัฒนาและแก้ไขข้อบกพร่องของฟังก์ชันคิวของงาน ดูการเปิด การบันทึก
สิทธิ์ IAM
คุณอาจเห็นPERMISSION DENIED
ข้อผิดพลาดเมื่อจัดคิวงานหรือเมื่อ Cloud Tasks พยายามเรียกใช้ฟังก์ชันคิวงาน ตรวจสอบว่าโปรเจ็กต์มี Binding IAM ต่อไปนี้
ข้อมูลประจำตัวที่ใช้ในการจัดคิวงานไปยัง Cloud Tasks ต้องมีสิทธิ์ IAM
cloudtasks.tasks.create
ในตัวอย่างนี้คือApp Engineบัญชีบริการเริ่มต้น
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudtasks.enqueuer
ข้อมูลประจำตัวที่ใช้ในการจัดคิวงานไปยัง Cloud Tasks ต้องมีสิทธิ์ ในการใช้บัญชีบริการที่เชื่อมโยงกับงานใน Cloud Tasks
ในตัวอย่างนี้คือApp Engineบัญชีบริการเริ่มต้น
ดูวิธีการเพิ่มApp Engineบัญชีบริการเริ่มต้น เป็นผู้ใช้App Engineบัญชีบริการเริ่มต้นได้ในเอกสารประกอบของ Google Cloud IAM
ข้อมูลประจำตัวที่ใช้ทริกเกอร์ฟังก์ชันคิวของงานต้องมีสิทธิ์
cloudfunctions.functions.invoke
ในตัวอย่างนี้คือApp Engineบัญชีบริการเริ่มต้น
gcloud functions add-iam-policy-binding $FUNCTION_NAME \
--region=us-central1 \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudfunctions.invoker