Messaging Patterns
ห้ารูปทรง broker เดียว
หัวข้อที่มีชื่อว่า “ห้ารูปทรง broker เดียว”ตลอดคอร์สนี้คุณได้เจอ building block มาแล้ว ต่อไปนี้คือ pattern ที่มีชื่อเรียก ซึ่งคุณหยิบมาใช้ได้ทันที โดยแต่ละอันจับคู่กับ exchange type ที่ใช้ implement
Work queue (competing consumers)
หัวข้อที่มีชื่อว่า “Work queue (competing consumers)”queue เดียว worker หลายตัว แต่ละ message ไปหา worker แค่ ตัวเดียว และ broker กระจาย load ให้เอง นี่คือ pattern สำหรับ กระจาย task — resize รูปนี้, ส่ง email นี้, process payment นี้ — ที่คุณเพิ่ม throughput ด้วยการเพิ่ม worker
Publish/subscribe
หัวข้อที่มีชื่อว่า “Publish/subscribe”event เดียว subscriber อิสระ หลายตัว แต่ละตัวมี queue ของตัวเองผ่าน fanout exchange subscriber ทุกตัวได้ copy ของตัวเอง ใช้ตอนต้องการ broadcast event ไปยังระบบที่ต้องตอบสนองแต่ละตัว — email, analytics, cache invalidation — โดยไม่มีตัวไหนต้องรู้จักตัวอื่น
Routing / topics
หัวข้อที่มีชื่อว่า “Routing / topics”การ deliver แบบเลือก direct หรือ topic exchange ส่ง message ไปเฉพาะ queue ที่ binding match กับ routing key ใช้ตอน consumer ต่างกันสนใจ event คนละ subset — order.*.created ที่นี่, payment.failed.# ที่นั่น
RPC (request/reply)
หัวข้อที่มีชื่อว่า “RPC (request/reply)”การสร้าง synchronous call-and-wait ขึ้นมาบน messaging โดยใช้ correlation_id และ reply_to มีประโยชน์เป็นครั้งคราว แต่ส่วนใหญ่เป็นสัญญาณว่าจริง ๆ คุณอยากได้ RPC/HTTP call ตรง ๆ มากกว่า — ใช้ให้น้อย
Event-driven choreography
หัวข้อที่มีชื่อว่า “Event-driven choreography”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"]
หมายเหตุเรื่อง 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 ของคุณ
การเลือก pattern
หัวข้อที่มีชื่อว่า “การเลือก pattern”| คุณต้องการจะ… | Pattern | Exchange type |
|---|---|---|
| กระจาย task ไปยัง worker | Work queue | direct / default |
| broadcast event ไปยังทุกตัวที่ตอบสนอง | Publish/subscribe | fanout |
| deliver เฉพาะ consumer ที่สนใจ | Routing | direct / topic |
| ได้ reply กลับจาก request | RPC | direct (+ reply queue) |
| ให้ service ตอบสนอง event โดยไม่มี orchestrator | Choreography | topic / fanout |