ข้ามไปยังเนื้อหา

Queue Properties

ทุกครั้งที่ declare queue คุณส่ง flag เข้าไปไม่กี่ตัว ดูเหมือน boilerplate แต่แต่ละตัวเปลี่ยนว่า queue จะอยู่ได้นานแค่ไหนและใครใช้ queue นั้นได้บ้าง ตั้งผิดแล้ว queue ของคุณอาจหายไปตอนที่ไม่คาดคิด หรือค้างอยู่ตลอดกาลตอนที่อยากให้หายไป

มี boolean flag สามตัวและถุงใส่ argument เพิ่มเติมอีกหนึ่งถุง

durable queue ถูกเขียนลง disk ดังนั้น definition ของตัวเองรอดจากการ restart RabbitMQ ส่วน queue ที่ไม่ durable (transient) จะถูกลืมเมื่อ broker restart

flag นี้คนเข้าใจผิดบ่อยที่สุด จึงต้องพูดให้ชัด: durable รักษา ตัว queue ไว้ ไม่ใช่ message ในนั้น ถ้าอยากให้ message รอดด้วย message ต้องถูก publish แบบ persistent (บทเรียนถัดไป) durable queue + persistent message คือคู่ที่ทำให้ “รอดจาก restart” — ขาดตัวใดตัวหนึ่งก็ยังเสียข้อมูลอยู่ดี

queue ไหนที่สำคัญ ให้ตั้ง durable: true

exclusive queue ใช้ได้เฉพาะ connection ที่ declare queue นั้นเท่านั้น และ ถูกลบอัตโนมัติเมื่อ connection นั้นปิด เหมาะสำหรับ reply queue ส่วนตัวชั่วคราว (คุณจะเห็นในบทเรียน RPC) และไม่เหมาะกับอะไรที่ต้องใช้ร่วมกัน

auto-delete queue ถูกลบเมื่อ consumer ตัวสุดท้าย unsubscribe (ต้องเคยมี consumer อย่างน้อยหนึ่งตัว) มีประโยชน์สำหรับ subscription ชั่วคราวที่ queue ไม่มีเหตุผลจะอยู่ต่อหลัง subscriber จากไป

// durable: true → the queue definition survives a broker restart
await channel.assertQueue('orders', {
durable: true,
exclusive: false,
autoDelete: false,
});

นอกจาก boolean สามตัว queue ยังรับ arguments table (มักเรียกว่า x-arguments เพราะ key ขึ้นต้นด้วย x-) ซึ่งปลดล็อกพฤติกรรมขั้นสูงที่จะครอบคลุมในคอร์สนี้ต่อไป:

Argumentทำอะไร
x-message-ttlmessage expire หลังจาก N มิลลิวินาที
x-expiresตัว queue เองถูกลบหลังจากไม่ถูกใช้ N ms
x-max-lengthจำกัดจำนวน message; overflow ถูก drop หรือ reject
x-dead-letter-exchangeที่ที่ message ซึ่ง expire/reject ถูกส่งไป (บทเรียน DLX)
x-queue-typeclassic หรือ quorum (บทเรียน clustering)
durable queue รักษาอะไรไว้ข้ามการ restart broker กันแน่?
exclusive queue ถูกลบเมื่อไร?
auto-delete queue ถูกลบเมื่อ:
คุณตั้งค่าอย่าง message TTL, max length และ dead-lettering ที่ไหน?