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