ฟังก์ชันของคิวงานใช้ประโยชน์จาก Google Cloud Tasks เพื่อช่วยให้แอปของคุณใช้เวลานาน ต้องใช้ทรัพยากรมาก หรือจำกัดแบนด์วิดท์ งานต่างๆ แบบไม่พร้อมกันภายนอกโฟลว์หลักของแอปพลิเคชัน
เช่น สมมติว่าคุณต้องการสร้างข้อมูลสำรองชุดรูปภาพขนาดใหญ่ ซึ่งปัจจุบันโฮสต์อยู่ใน API โดยมีขีดจำกัดอัตราคำขอ หากต้องการเป็น ผู้บริโภคที่รับผิดชอบของ API ดังกล่าว คุณจะต้องเคารพขีดจำกัดอัตราคำขอ นอกจากนี้ งานที่ใช้เวลานานนี้อาจเสี่ยงต่อการล้มเหลวเนื่องจากหมดเวลา ขีดจำกัดของหน่วยความจำ
เพื่อลดความซับซ้อนนี้ คุณสามารถเขียนฟังก์ชันคิวงานที่ตั้งค่าพื้นฐาน
ตัวเลือกงาน เช่น scheduleTime
และ dispatchDeadline
แล้วมอบหมาย
ปิดไปยังคิวใน Cloud Tasks Cloud Tasks
ได้รับการออกแบบเป็นพิเศษเพื่อให้มั่นใจว่าการควบคุมความคับคั่งที่มีประสิทธิภาพ
ลองกำหนดนโยบายอีกครั้งสำหรับการดำเนินการประเภทนี้
Firebase SDK สำหรับการทำงานร่วมกันระหว่าง Cloud Functions for Firebase เวอร์ชัน 3.20.1 ขึ้นไป มี Firebase Admin SDK v10.2.0 ขึ้นไปเพื่อรองรับฟังก์ชันคิวงาน
การใช้ฟังก์ชันคิวงานกับ Firebase อาจส่งผลให้มีการเรียกเก็บเงินสำหรับ กำลังประมวลผล Cloud Tasks โปรดดู ราคา Cloud Tasks เพื่อดูข้อมูลเพิ่มเติม
สร้างฟังก์ชันคิวงาน
หากต้องการใช้ฟังก์ชันคิวงาน ให้ทำตามขั้นตอนต่อไปนี้
- เขียนฟังก์ชันคิวงานโดยใช้ SDK ของ Firebase สำหรับ Cloud Functions
- ทดสอบฟังก์ชันโดยทริกเกอร์ด้วยคำขอ HTTP
- ทำให้ฟังก์ชันใช้งานได้ด้วย CLI ของ Firebase เมื่อทำให้งานของคุณใช้งานได้ เป็นครั้งแรก CLI จะสร้าง คิวงานใน Cloud Tasks พร้อมตัวเลือก (การจำกัดอัตราและลองใหม่) ที่ระบุไว้ในซอร์สโค้ด
- เพิ่มงานลงในคิวงานที่สร้างขึ้นใหม่ ส่งผ่านพารามิเตอร์เพื่อตั้งค่า กำหนดการดำเนินการหากจำเป็น คุณสามารถทำได้โดยเขียนโค้ด โดยใช้ Admin SDK และทำให้ใช้งานได้กับ Cloud Functions for Firebase
เขียนฟังก์ชันของคิวงาน
ใช้ onDispatch
เพื่อเริ่มเขียนฟังก์ชันคิวงาน องค์ประกอบสำคัญ
ส่วนหนึ่งของการเขียนฟังก์ชันคิวงานคือการตั้งค่า การลองใหม่ต่อคิวและอัตรา
การจำกัดการกำหนดค่า ตัวอย่างโค้ดในหน้านี้จะอิงตามแอปที่ตั้งค่า
บริการที่สำรองข้อมูลรูปภาพทั้งหมดจากองค์การนาซา
ภาพประจำวันของดาราศาสตร์
กำหนดค่าฟังก์ชันคิวงาน
ฟังก์ชันคิวงานมาพร้อมกับชุดการตั้งค่าการกำหนดค่าที่มีประสิทธิภาพ เพื่อควบคุมขีดจำกัดอัตราคำขอและการทำงานซ้ำของคิวงานอย่างละเอียด
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 เป็นวิธีที่ดีที่สุดในการทดสอบงาน ของฟังก์ชันคิว โปรดดูวิธีดำเนินการจากเอกสารชุดโปรแกรมจำลอง สร้างเครื่องมือให้แก่แอปสำหรับการจำลองฟังก์ชันของคิวงาน
นอกจากนี้ ฟังก์ชันคิวงานจะแสดง ฟังก์ชัน 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 มีข้อมูลการวินิจฉัยที่มีประโยชน์ เช่น สถานะคำขอที่เชื่อมโยงกับงาน โดยค่าเริ่มต้น บันทึกจาก Cloud Tasks ปิดอยู่เนื่องจากมีบันทึกจำนวนมาก ที่อาจสร้างขึ้นในโปรเจ็กต์ของคุณได้ เราขอแนะนำให้คุณเปิดบันทึกการแก้ไขข้อบกพร่อง ขณะที่คุณกำลังพัฒนาและแก้ไขข้อบกพร่องของฟังก์ชันคิวงาน โปรดดู กำลังเปิด Logging
สิทธิ์ IAM
คุณอาจเห็นข้อผิดพลาด PERMISSION DENIED
รายการเมื่อจัดคิวงานหรือเมื่อ
Cloud Tasks พยายามเรียกใช้ฟังก์ชันคิวงาน ตรวจสอบว่า
โปรเจ็กต์มีการเชื่อมโยง 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 บัญชี
ดูเอกสารประกอบ Google Cloud IAM เพื่อดูวิธีการเพิ่มบัญชีบริการเริ่มต้น App Engine ในฐานะผู้ใช้บัญชีบริการเริ่มต้น App Engine
ข้อมูลประจำตัวที่ใช้ในการทริกเกอร์ความต้องการฟังก์ชันคิวงาน สิทธิ์
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