RabbitMQ & AMQP
RabbitMQ implement protocol
หัวข้อที่มีชื่อว่า “RabbitMQ implement protocol”RabbitMQ คือ message broker และ protocol หลักที่พูดคือ AMQP 0-9-1 (Advanced Message Queuing Protocol) ความต่างนี้สำคัญ: AMQP คือ open specification ว่า client กับ broker คุยกันอย่างไร ส่วน RabbitMQ คือหนึ่ง implementation (ที่นิยมมาก) ของตัวเอง เพราะ protocol เป็นมาตรฐาน จึงมี client ให้แทบทุกภาษา และทั้งหมด interoperate กับ broker ตัวเดียวกันได้
RabbitMQ ยังพูด protocol อื่นผ่าน plugin ได้ด้วย — MQTT, STOMP และ Streams protocol ของตัวเอง — แต่ AMQP 0-9-1 คือ model หลักที่คอร์สนี้ยึดเป็นฐาน และเป็นตัวที่คุณจะใช้ 95% ของเวลา
AMQP model: producer ไม่ publish เข้า queue
หัวข้อที่มีชื่อว่า “AMQP model: producer ไม่ publish เข้า queue”นี่คือไอเดียที่สำคัญที่สุดใน AMQP และเป็นสิ่งที่คนมาจาก queue แบบง่าย ๆ มักแปลกใจ:
producer ไม่เคย publish เข้า queue ตรง ๆ แต่ publish เข้า exchange
จากนั้น exchange จะตัดสินใจ — จากกฎที่เรียกว่า binding — ว่า message ควรตกลงไปที่ queue ตัวไหนบ้าง queue แบบธรรมดาบอกว่า “เอาอันนี้ใส่ queue X” แต่ AMQP บอกว่า “ส่งให้ที่ทำการไปรษณีย์ (exchange) แล้วให้ exchange route ตามกฎ”
flowchart LR p["Producer"] -->|"publish (routing key)"| x["Exchange"] x -->|binding A| q1["Queue 1"] x -->|binding B| q2["Queue 2"] q1 --> c1["Consumer 1"] q2 --> c2["Consumer 2"]
ทำไม indirection นี้ถึงทรงพลัง
หัวข้อที่มีชื่อว่า “ทำไม indirection นี้ถึงทรงพลัง”การวาง exchange ไว้ระหว่าง producer กับ queue ฟังดูเหมือนพิธีรีตองเพิ่ม แต่ให้ความยืดหยุ่นมหาศาล:
- หนึ่ง message ไปได้หลายปลายทาง exchange copy message ไปหลาย queue พร้อมกันได้ (broadcast) — producer publish ครั้งเดียวโดยไม่ต้องเปลี่ยนอะไร
- route ตาม content exchange แต่ละ type route ด้วย key แบบ exact, แบบ pattern หรือตาม attribute ของ message — ดังนั้น “payment event ทั้งหมด” กับ “เฉพาะ failed payment ในไทย” จึงแยกเป็นคนละ queue ที่ป้อนจาก publisher เดียวกันได้
- เพิ่ม consumer โดยไม่แตะ producer อยากได้ audit log ใหม่ของทุก order? bind queue ใหม่เข้ากับ exchange order service ไม่ต้องเปลี่ยนเลย
นี่คือความต่างระหว่าง queue (ถังที่คุณโยนของใส่) กับ messaging system (routing fabric ที่คุณ publish event เข้าไป)
building block ต่าง ๆ พร้อมชื่อ
หัวข้อที่มีชื่อว่า “building block ต่าง ๆ พร้อมชื่อ”คุณจะได้เจอทั้งหมดนี้แบบเจาะลึกในบทถัด ๆ ไป แต่นี่คือคำศัพท์ที่ AMQP ให้มา:
| Term | คืออะไร |
|---|---|
| Broker | ตัว RabbitMQ server เอง |
| Connection | TCP connection ที่อายุยาวจาก client ไป broker |
| Channel | virtual connection น้ำหนักเบาที่ multiplex อยู่บน connection เดียว |
| Exchange | รับ message ที่ publish เข้ามาแล้ว route ไป queue |
| Queue | buffer ที่เก็บ message ไว้จนกว่า consumer จะมารับ |
| Binding | กฎที่เชื่อม exchange กับ queue |
| Routing key | label บน message ที่ exchange ใช้ในการ route |