Skip to main content

Blog

Polling และ Webhook ของ PiAPI: จัดการงานเสร็จอย่างเชื่อถือได้

ภาพประกอบเครื่องมือพัฒนา PiAPI

เมื่อคำขอภาพหรือวิดีโอได้รับการยอมรับ ยังต้องมีขั้นตอนจัดการเมื่อทำงานเสร็จ สำหรับงานที่ใช้ Unified API ของ PiAPI ให้บันทึกรหัสงาน ตรวจสถานะสุดท้าย แล้วจัดการผลลัพธ์ตามโมเดล การ polling เหมาะกับการเชื่อมต่อครั้งแรก ส่วน webhook ช่วยให้แบ็กเอนด์ตอบสนองเมื่องานจบ

1. บันทึกรหัสงานและจำกัดการ polling

หลังสร้างงาน ให้บันทึก data.task_id คู่กับรหัสงานของแอป ดึงงานเดิมด้วยคีย์ API ฝั่งเซิร์ฟเวอร์ การตอบกลับ HTTP สำเร็จไม่ได้ยืนยันว่าการสร้างเสร็จแล้ว ต้องตรวจ data.status

curl --fail-with-body --silent --show-error \
  "https://api.piapi.ai/api/v1/task/${PIAPI_TASK_ID}" \
  --header "x-api-key: ${PIAPI_API_KEY}"

เมื่อเป็น completed ให้ตรวจ data.output ตามโมเดล เมื่อเป็น failed ให้บันทึก data.error จำกัดจำนวนครั้งที่ลองใหม่ เพิ่มช่วงรอและสุ่มความหน่วงเล็กน้อย กำหนดเวลารอของแอปเป็นการตัดสินใจภายใน การหมดเวลาไม่ได้แปลว่างานปลายทางล้มเหลวหรือถูกยกเลิก เก็บรหัสไว้ตรวจสอบภายหลัง

2. เพิ่ม callback ที่ตรวจสอบตัวตน

ผสานส่วนตั้งค่าด้านล่างกับเนื้อหาคำขอสร้างงานที่ถูกต้อง โดยคงฟิลด์เดิมไว้ ใช้ปลายทาง HTTPS สาธารณะและค่าลับจากที่เก็บที่ปลอดภัยของแบ็กเอนด์ เอกสาร PiAPI ระบุว่าส่งค่าลับในเฮดเดอร์ x-webhook-secret จึงต้องตรวจสอบก่อนรับการแจ้งเตือน

{
  "config": {
    "webhook_config": {
      "endpoint": "https://your-app.example/piapi/callback",
      "secret": "YOUR_WEBHOOK_SECRET"
    }
  }
}

JSON ของ webhook มี timestamp และ data ตรวจว่างานเป็นของแอป จากนั้นบันทึกเหตุการณ์อย่างถาวรหรือใส่คิวถาวร แล้วตอบ 2xx โดยเร็ว ทำการดาวน์โหลดและงานที่ใช้เวลานานนอกตัวจัดการ HTTP เตรียมรับการส่งซ้ำ เพราะเอกสารอธิบายการลองใหม่เมื่อไม่ได้รับคำตอบสำเร็จ

3. รวม polling และ callback เข้าสู่การประมวลผลเดียว

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

หาก callback ไม่มา หรือสถานะไม่ชัด ให้ดึงรหัสงานที่บันทึกไว้อีกครั้ง การหมดเวลาระหว่างดึงข้อมูลไม่ใช่เหตุผลให้สร้างงานเสียเงินใหม่ทันที แยกข้อผิดพลาดการรับส่งออกจากงานล้มเหลวที่ยืนยันแล้ว และตรวจสอบก่อนส่งใหม่

4. ทดสอบกรณีผิดพลาด

ก่อนเปิดใช้ ให้ส่ง callback ซ้ำ ใช้ค่าลับผิด หน่วงการส่ง และจำลองการเริ่ม worker ใหม่ ตรวจว่าแต่ละงานที่เสร็จมีผลลัพธ์ถาวรหนึ่งรายการ และงานที่ล้มเหลวเก็บข้อผิดพลาดไว้ จากนั้นใช้คู่มือเก็บผลลัพธ์เพื่อรักษาไฟล์

อ้างอิง: โครงสร้าง Unified API, ตัวอย่างดึงงาน และเอกสาร Webhook ตัวอย่างอธิบายโครงสร้างการเชื่อมต่อ ไม่ใช่ผลทดสอบประสิทธิภาพการสร้างจริง