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

Direct Exchange

direct exchange route message ไปยัง queue ที่มี binding key ตรงกับ routing key ของ message เป๊ะ ๆ ไม่มี pattern ไม่มี wildcard — เทียบ string ให้เท่ากันตรง ๆ นี่คือ exchange type ที่ง่ายที่สุด และเป็นตัวที่หยิบมาใช้เมื่อ message มีปลายทางเป็นหมวดหมู่ที่ชัดเจนหมวดเดียว

จริง ๆ คุณเคยใช้ direct exchange มาแล้วโดยไม่รู้ตัว: default exchange คือ direct exchange ที่ไม่มีชื่อ ซึ่งทุก queue จะถูก bind เข้าไปด้วยชื่อของตัวเองโดยอัตโนมัติ นั่นคือเหตุผลที่ publish ไปที่ routing key hello ด้วย exchange เป็น string ว่าง แล้ว message ไปลงที่ queue ชื่อ hello

สมมติคุณส่ง log message และอยากให้ log ระดับ error ไปเข้า queue หนึ่ง (ไว้ alert) และ info ไปอีก queue หนึ่ง (ไว้ archive) ก็ประกาศ direct exchange, bind แต่ละ queue ด้วย severity เป็น binding key แล้ว publish โดยใช้ severity เป็น routing key

flowchart LR
  p["publish
key: error"] --> x["direct exchange
'logs'"]
  x -->|"bind key: error"| qe["queue: errors"]
  x -->|"bind key: info"| qi["queue: info"]
  x -. "ไม่ match 'error'" .-> qi
direct exchange match routing key กับ binding key

message ที่ publish ด้วย routing key error จะ match แค่ binding ที่ key เป็น error เท่านั้น จึงไปเข้า queue errors ไม่ใช่ info

const ex = 'logs';
await channel.assertExchange(ex, 'direct', { durable: true });
// consumer side: bind a queue for errors only
const q = await channel.assertQueue('errors', { durable: true });
await channel.bindQueue(q.queue, ex, 'error');
// producer side: publish with the severity as the routing key
channel.publish(ex, 'error', Buffer.from('disk full on node-3'));
channel.publish(ex, 'info', Buffer.from('user logged in'));

direct exchange ไม่ได้จำกัดที่ queue เดียวต่อ key ถ้ามี queue สองตัว bind ด้วย key error เหมือนกัน message error ตัวเดียวจะถูก copy ไป ทั้งสอง queue — คุณจึงผสม routing แบบ match เป๊ะเข้ากับการ fan-out นิด ๆ ได้ ในทางกลับกัน queue เดียวก็ bind ได้หลาย key (bind errors กับทั้ง error และ critical) เพื่อรวบหลายหมวดมาไว้ด้วยกัน

direct exchange ตัดสินใจอย่างไรว่า queue ไหนจะได้ message?
"default exchange" คือ exchange type ไหน?
queue สองตัว bind เข้า direct exchange ด้วย key "error" เหมือนกัน message ที่ publish ด้วย routing key "error" จะ: