จัดคิวฟังก์ชันด้วย Cloud Tasks


ฟังก์ชันของคิวงานใช้ประโยชน์จาก Google งานระบบคลาวด์ เพื่อช่วยให้แอปของคุณใช้เวลานาน ต้องใช้ทรัพยากรมาก หรือจำกัดแบนด์วิดท์ งานต่างๆ แบบไม่พร้อมกันภายนอกโฟลว์หลักของแอปพลิเคชัน

เช่น สมมติว่าคุณต้องการสร้างข้อมูลสำรองชุดรูปภาพขนาดใหญ่ ซึ่งปัจจุบันโฮสต์อยู่ใน API โดยมีขีดจำกัดอัตราคำขอ หากต้องการเป็น ผู้บริโภคที่รับผิดชอบของ API ดังกล่าว คุณจะต้องเคารพขีดจำกัดอัตราคำขอ นอกจากนี้ งานที่ใช้เวลานานนี้อาจเสี่ยงต่อการล้มเหลวเนื่องจากหมดเวลา ขีดจำกัดของหน่วยความจำ

เพื่อลดความซับซ้อนนี้ คุณสามารถเขียนฟังก์ชันคิวงานที่ตั้งค่าพื้นฐาน ตัวเลือกงาน เช่น scheduleTime และ dispatchDeadline แล้วมอบหมาย ปิดไปยังคิวใน Cloud Tasks งานระบบคลาวด์ มีการออกแบบสภาพแวดล้อม โดยเฉพาะ เพื่อให้มั่นใจว่าการควบคุมความคับคั่งนั้นมีประสิทธิผล ลองกำหนดนโยบายอีกครั้งสำหรับการดำเนินการประเภทนี้

Firebase SDK for Cloud Functions for Firebase v3.20.1 ขึ้นไปทำงานร่วมกัน มี Firebase Admin SDK เวอร์ชัน 10.2.0 ขึ้นไปเพื่อรองรับฟังก์ชันคิวงาน

การใช้ฟังก์ชันคิวงานกับ Firebase อาจส่งผลให้มีการเรียกเก็บเงินสำหรับ กำลังประมวลผลงานระบบคลาวด์ โปรดดู ราคาของ Cloud Tasks เพื่อดูข้อมูลเพิ่มเติม

สร้างฟังก์ชันคิวงาน

หากต้องการใช้ฟังก์ชันคิวงาน ให้ทำตามขั้นตอนต่อไปนี้

  1. เขียนฟังก์ชันคิวงานโดยใช้ Firebase SDK สำหรับ Cloud Functions
  2. ทดสอบฟังก์ชันโดยทริกเกอร์ด้วยคำขอ HTTP
  3. ทำให้ฟังก์ชันใช้งานได้ด้วย Firebase CLI เมื่อทำให้งานของคุณใช้งานได้ เป็นครั้งแรก CLI จะสร้าง คิวงานใน Cloud Tasks พร้อมตัวเลือก (การจำกัดอัตราและลองใหม่) ที่ระบุไว้ในซอร์สโค้ด
  4. เพิ่มงานลงในคิวงานที่สร้างขึ้นใหม่ ส่งผ่านพารามิเตอร์เพื่อตั้งค่า กำหนดการดำเนินการหากจำเป็น คุณสามารถทำได้โดยเขียนโค้ด โดยใช้ 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

ทดสอบฟังก์ชันของคิวงาน

ระบบจะแสดงฟังก์ชันคิวงานในชุดโปรแกรมจำลองภายในของ Firebase ฟังก์ชัน HTTP คุณทดสอบฟังก์ชันงานที่จำลองได้โดยส่ง 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 จะสร้างงานใหม่ โดยเพิ่มคิวไว้ใน งานระบบคลาวด์ และกำหนดการกำหนดค่าสำหรับงานดังนี้

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 จะรอ เพื่อให้งานเสร็จสมบูรณ์ งานระบบคลาวด์จะลองอีกครั้ง งานหลังจากการลองใหม่ การกำหนดค่าของคิว หรือจนกว่าจะถึงกำหนดเวลานี้ ในตัวอย่างนี้ คิวจะได้รับการกำหนดค่าให้ลองทำงานอีกครั้งได้สูงสุด 5 ครั้ง แต่งาน ยกเลิกโดยอัตโนมัติหากทั้งกระบวนการ (รวมถึงการพยายามลองอีกครั้ง) ใช้เวลานานกว่า 5 นาที

การแก้ปัญหา

เปิดการบันทึก 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