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

RabbitMQ & AMQP

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 และเป็นสิ่งที่คนมาจาก 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"]
AMQP 0-9-1 routing model

การวาง 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 เข้าไป)

คุณจะได้เจอทั้งหมดนี้แบบเจาะลึกในบทถัด ๆ ไป แต่นี่คือคำศัพท์ที่ AMQP ให้มา:

Termคืออะไร
Brokerตัว RabbitMQ server เอง
ConnectionTCP connection ที่อายุยาวจาก client ไป broker
Channelvirtual connection น้ำหนักเบาที่ multiplex อยู่บน connection เดียว
Exchangeรับ message ที่ publish เข้ามาแล้ว route ไป queue
Queuebuffer ที่เก็บ message ไว้จนกว่า consumer จะมารับ
Bindingกฎที่เชื่อม exchange กับ queue
Routing keylabel บน message ที่ exchange ใช้ในการ route
ความสัมพันธ์ระหว่าง RabbitMQ กับ AMQP คืออะไร?
ใน AMQP model producer publish message ไปที่ไหน?
ทำไม design ที่มี exchange อยู่ตรงกลางถึงทรงพลัง?
binding คืออะไร?