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

Messaging Patterns

ตลอดคอร์สนี้คุณได้เจอ building block มาแล้ว ต่อไปนี้คือ pattern ที่มีชื่อเรียก ซึ่งคุณหยิบมาใช้ได้ทันที โดยแต่ละอันจับคู่กับ exchange type ที่ใช้ implement

queue เดียว worker หลายตัว แต่ละ message ไปหา worker แค่ ตัวเดียว และ broker กระจาย load ให้เอง นี่คือ pattern สำหรับ กระจาย task — resize รูปนี้, ส่ง email นี้, process payment นี้ — ที่คุณเพิ่ม throughput ด้วยการเพิ่ม worker

event เดียว subscriber อิสระ หลายตัว แต่ละตัวมี queue ของตัวเองผ่าน fanout exchange subscriber ทุกตัวได้ copy ของตัวเอง ใช้ตอนต้องการ broadcast event ไปยังระบบที่ต้องตอบสนองแต่ละตัว — email, analytics, cache invalidation — โดยไม่มีตัวไหนต้องรู้จักตัวอื่น

การ deliver แบบเลือก direct หรือ topic exchange ส่ง message ไปเฉพาะ queue ที่ binding match กับ routing key ใช้ตอน consumer ต่างกันสนใจ event คนละ subsetorder.*.created ที่นี่, payment.failed.# ที่นั่น

การสร้าง synchronous call-and-wait ขึ้นมาบน messaging โดยใช้ correlation_id และ reply_to มีประโยชน์เป็นครั้งคราว แต่ส่วนใหญ่เป็นสัญญาณว่าจริง ๆ คุณอยากได้ RPC/HTTP call ตรง ๆ มากกว่า — ใช้ให้น้อย

pattern เชิงสถาปัตยกรรมที่อยู่เหนือตัวอื่น: service ปล่อย event (“OrderPlaced”) แล้ว service อื่น ตอบสนอง โดยไม่มี orchestrator กลางคอยสั่งว่าต้องทำอะไร RabbitMQ คือระบบประสาทที่ส่ง event เหล่านั้น

flowchart LR
  order["Order service"] -->|"OrderPlaced"| x["events exchange"]
  x --> q1["payment queue"] --> s1["Payment service"]
  x --> q2["inventory queue"] --> s2["Inventory service"]
  x --> q3["email queue"] --> s3["Notification service"]
Choreography — event เดียว การตอบสนองอิสระหลายตัว

หมายเหตุเรื่อง saga: เมื่อ business process ครอบคลุมหลาย service (place order → charge → reserve stock → ship) choreography ร้อยแต่ละ step เข้าด้วยกันเป็น chain ของ event และแต่ละ step publish step ถัดไป ถ้า step ไหนล้มเหลว compensating event จะ undo step ก่อนหน้า RabbitMQ ส่ง event; ส่วน logic ของ saga อยู่ใน service ของคุณ

คุณต้องการจะ…PatternExchange type
กระจาย task ไปยัง workerWork queuedirect / default
broadcast event ไปยังทุกตัวที่ตอบสนองPublish/subscribefanout
deliver เฉพาะ consumer ที่สนใจRoutingdirect / topic
ได้ reply กลับจาก requestRPCdirect (+ reply queue)
ให้ service ตอบสนอง event โดยไม่มี orchestratorChoreographytopic / fanout
ใน work queue มี worker กี่ตัวที่ process แต่ละ message?
อะไรที่ทำให้ publish/subscribe ต่างจาก work queue?
event-driven choreography คืออะไร?
pattern ไหนที่ควรทำให้คุณหยุดคิดว่า "จริง ๆ ฉันอยากได้ RPC/HTTP call ปกติหรือเปล่า?"