~/VibeHandbook
PDF ฟรี

Cloudflare

developers.cloudflare.com

Queues

คืออะไร

ลองนึกภาพร้านกาแฟ: คุณสั่งกาแฟที่เคาน์เตอร์แล้วเดินไปทำอย่างอื่น ส่วนบาริสต้าก็ทยอยทำตามใบสั่งทีละใบ คิว () ก็คือแถวของใบสั่งนั้นเอง Cloudflare Queues คือระบบคิวข้อความ (message queue) แบบมีคนดูแลให้สำหรับ Workers ที่สร้างขึ้นบนแนวคิดนี้ Worker ตัวหนึ่งจะโยนข้อความเข้าไปในคิว (ผู้ผลิต หรือ producer เปรียบเหมือนแคชเชียร์ที่รับออเดอร์) ส่วน Worker อีกตัวจะได้รับข้อความเหล่านั้นเป็นชุด ๆ มาทยอยจัดการ (ผู้บริโภค หรือ consumer เปรียบเหมือนบาริสต้า) วิธีนี้ช่วยแยกงานที่ทำช้าหรือไม่แน่นอนออกจากคำขอ (request) ที่เป็นต้นเหตุ — รับคำขอให้ไวก่อน แล้วค่อยไปทำงานเบื้องหลัง

จุดแข็ง

  • แยก producer ออกจาก consumer ทำให้รองรับช่วงที่ทราฟฟิกพุ่งสูงได้ราบรื่นขึ้น
  • มีการรวมข้อความเป็นชุด (batching) การลองใหม่อัตโนมัติ (retries) และ dead-letter queue (พื้นที่พักข้อความที่ล้มเหลวซ้ำ ๆ) เพื่อไม่ให้ข้อความหายไปเงียบ ๆ
  • ผสานกับ Workers ล้วน ๆ — ทั้ง producer และ consumer ต่างก็เป็น Workers ที่ผูก (binding) เข้าด้วยกัน
  • ไม่ต้องดูแลโครงสร้างพื้นฐานเอง รองรับปริมาณตามทราฟฟิกที่เพิ่มขึ้น
  • รับประกันการส่งข้อความอย่างน้อยหนึ่งครั้ง (at-least-once delivery) ข้อความจึงไม่หายไปเงียบ ๆ

ข้อแลกเปลี่ยน

  • การส่งแบบ at-least-once หมายความว่า consumer ควรทำงานแบบ — คือปลอดภัยแม้ถูกรันซ้ำสองครั้งกับข้อความเดียวกันโดยไม่เกิดผลเสีย (ต้องรับมือกับข้อความซ้ำได้)
  • ไม่เหมาะกับการตอบสนองแบบทันทีทันใด (synchronous) — งานจะถูกทำแบบอะซิงโครนัส (asynchronous) คือทำในเบื้องหลังโดยไม่ต้องรอ
  • ลำดับข้อความเป็นแบบ best-effort เท่านั้น ไม่ใช่ลำดับที่รับประกันแบบเคร่งครัดทั่วทั้งระบบ
  • มีขีดจำกัดด้านปริมาณงาน (throughput) และขนาดข้อความที่ต้องคำนึงถึงตอนออกแบบ

ควรใช้เมื่อไร

ใช้ Queues สำหรับงานเบื้องหลัง เช่น ส่งอีเมล ประมวลผลไฟล์ที่อัปโหลด เรียกใช้ (Application Programming Interface — จุดเชื่อมต่อที่ใช้พูดคุยกับบริการอื่น) ของบุคคลที่สามที่ทำงานช้า กระจาย ออกไปหลายที่ หรือบัฟเฟอร์การเขียนข้อมูล — สรุปคือใช้กับอะไรก็ตามที่คุณไม่อยากให้ผู้ใช้ต้องรอ

เข้ากับ vibe coding แค่ไหน

Queues เป็นวิธีที่สะอาดสำหรับให้ เพิ่มการประมวลผลเบื้องหลังโดยไม่ต้องตั้งระบบ broker เอง ขอให้ agent ทำให้ consumer เป็น idempotent (ใช้คีย์ของข้อความ) และตั้ง dead-letter queue ไว้เพื่อให้เห็นความล้มเหลวได้ชัดเจน การตั้งค่านี้ผูก Worker ตัวเดียวให้เป็นทั้ง producer และ consumer ของคิว

# wrangler.toml
[[queues.producers]]
queue = "jobs"
binding = "JOBS"

[[queues.consumers]]
queue = "jobs"
max_batch_size = 10
dead_letter_queue = "jobs-dlq"
npx wrangler queues create jobs
npx wrangler deploy