จากการสอนใน course Microservices workshop ที่ Skooldio ไปนั้น
มีการแนะนำในเรื่องของการนำ messaging และ Event-based architecture มาใช้งาน
และได้มีคำถามเกี่ยวกับการนำ RabbitMQ มาใช้งาน
ว่าจะออกแบบตามที่ต้องการอย่างไรบ้าง ?

คำถามคือ
จะออกแบบอย่างไรใน RabbitMQ
โดยให้แต่ละ service หรือ consumer ได้ message เหมือนกัน
ซึ่งตรงนี้ใช้ Topic ปกติได้เลย
ทำให้แต่ละ message ที่เข้ามากระจายไปยังทุก ๆ consumer

แต่ความต้องการยังไม่จบ
เนื่องจากถ้าให้แต่ละ consumer คือ service ของระบบงานแล้ว
ถ้าต้องการ scale service จาก 1 เป็น 5 แล้ว
ต้องการให้ message ทำงานเพียงครั้งเดียวใน service นั้น ๆ
ไม่ต้องการให้ทุก ๆ  instance ที่ scale มาจาก service เดียวกันได้รับ message

คำถามคือ ทำอย่างไร ?

โดยปกติใน RabbitMQ จะมี exchange ในฝั่ง producer กำหนดให้เป็น type=topic

จากนั้นในฝั่ง consumer นั้น
กำหนดค่า property exclusive = false 
เพื่อให้ queue สามารถ binding กับ consumer ได้มากกว่า 1 ตัว
เนื่องจากค่า default นั้น queue
จะ binding กับ consumer ได้แบบ 1 ต่อ 1 เท่านั้นคือเป็นค่า true

รวมทั้งชื่อ queue ให้เป็นชื่อ service นั้น ๆ เพื่อ binding กับ exchange ไปเลย
เพียงเท่านี้ก็สามารถทำให้ RabbitMQ ทำงานตามที่เราต้องการได้แล้ว
ปล. เพื่อความถูกต้องอย่าลืมกำหนด QoS(Quality of Service) ด้วย

โดยที่ตัวอย่างสามารถดูได้จาก GitHub:Up1