จากที่เคยพูดถึง kafka ไป; ตัว RabbitMQ เองก็เป็นหนึ่งในเครื่องมือที่เอาไว้ใช้ทำ Message Queue; ใน Kafka จะจัดงานโดยใช้เรื่อง Partition มาช่วยแต่ใน RabbitMQ นั้นจะมีวิธีจัดการที่ต่างออกไป
ใน RabbitMQ เราจะให้แบ่งออกเป็นสี่ส่วน ก็คือ Producer, Exchange, Queue และ Consumer (Channel)
Producer ก็เป็นคนส่งข้อมูลและ Consumer ก็คือคนรับข้อมูลเหมือนเดิม; Producer นั้นจะไม่ได้ส่งข้อมูลมาที่ Queue ตรง ๆ ให้ Consumer ใช้ แต่จะผ่าน Exchange ก่อน;
Exchange จะทำการดูแลเรื่อง routing ว่าข้อมูลควรจะถูกส่งไปที่ Queue ตัวไหนก่อนที่จะให้ Consumer ดึงข้อมูลจาก Queue อีกที
Queue สามารถควบคุมได้ว่าจะให้ consumers อ่านข้อมูลได้ 1 consumer หรือหลาย consumers ได้โดยการตั้งค่าเรื่อง exclusive; กรณีที่ Queue ตัวนึงถูก consumers อ่านหลายตัว ข้อมูลที่เข้ามาตัวนึงใน queue นั้นจะไม่ได้แชร์ส่งไปให้ consumers ทุกตัว แต่จะใช้ระบบ round robin คือวนแจกข้อมูลไปให้กับ consumers แต่ละตัวในที่อ่านใน queue เดียวกัน; กล่าวก็คือ consumer ตัวนึงจะได้อ่านข้อมูลอีกครั้งเมื่อข้อมูลผ่านไป N ตัว (เมื่อ N คือจำนวน consumers ใน queue ณ ขณะนั้น)
เสริม เราสามารถตั้งค่าให้ consumer ได้อ่านข้อมูลจาก Queue ทีละตัวโดยที่ไม่ดึงข้อมูลมาที่ consumer ล่วงหน้า (ที่เป็นค่าเริ่มต้น) เนื่องจาก round robin จะไม่รู้ว่า consumers นั้นจัดการกับข้อมูลแต่ละตัวเสร็จแล้วหรือยัง และจะให้ข้อมูลไปทิ้งไว้ที่ consumers ล่วงหน้า ทำให้มี consumer บางตัวทำงานหนักเกินไปได้; เราจึงมีการตั้งค่าเพื่อป้องกันไม่ให้ consumer ตัวนึงมีงานกองมากเกินไป โดยจะให้ consumer นั้นดึงข้อมูลก็ต่อเมื่อจัดการกับข้อมูลปัจจุบันเรียบร้อยแล้ว; ตรงนี้จะเรียกว่า Quality of Service
ข้อมูลที่ส่งมาจาก Producer จะดูแลเรื่องการ routing ข้อมูลที่จะส่งไปให้ที่ queue; เบื้องต้นในการทำงานจะเป็นนี้
ต่อไปจะเป็นเรื่องประเภทของ Exchange ว่ากำหนด routing อย่างไร
*.juice
แล้ว producer ที่ส่งมาแล้วกำหนด routing key เป็น orange.juice ก็จะส่งไปหาได้
แต่ถ้าเป็น apple.pen ก็จะไม่ถูกส่ง (ต้องเป็นคำอะไรก็ได้ตามด้วย .juice)RabbitMQ นั้นมีระบบสำหรับตอบกลับข้อมูลที่ส่งมาโดยการกำหนดชื่อ queue ที่จะให้ตอบกลับผ่าน reply to ตอนที่ส่งข้อมูลมา แล้ว consumer ก็จะใช้ชื่อ queue นั้นตอบกลับไป (อาจมีการกำหนด correlation id เพื่อระบุตัวตน)