接續上一篇 RabbitMQ(2)
路由 (Routing)
選擇性地接受訊息,只有符合特定條件的消費者才會接收到訊息。
Preparation 寓意 主要目的:
- 有條件的接收訊息,只有符合特定條件的消費者才會接收到訊息。
- 比方說,log 訊息中會分成不同層度上的錯誤訊息;而透過此就可以將不同層級的錯誤進行紀錄、通知。
說明:
在程式範例中,使用
direct來進行訊息的路由,並且透過 routing key 來進行訊息的路由。多重綁定 (Multiple bindings)
透過多重綁定,可以將多個 queue 綁定到同一個 routing key 上,這樣就可以讓多個 queue 接收到相同的訊息。
producer透過 producer 進行產生任務時,透過 routing key 來進行訊息的路由,並且透過 exchange 來進行訊息的轉發。$channel->basic_publish( message: new AMQPMessage($data), exchange: 'direct_logs', // exchange 名稱 routing_key: $severity // routing key <----- 這邊設定要推送到哪個 routing key );consumerconsumer 設定 routing key 來進行訊息的接收,並且透過 exchange 來進行訊息的轉發。$channel->queue_bind( queue: $queue_name, // queue 名稱 exchange: 'direct_logs', // exchange 名稱 routing_key: $severity // routing key <----- 這邊設定要接收到哪個 routing key );
主題 (Topics)
透過 topic 來進行訊息的路由,並且透過 routing key 來進行訊息的路由。 就是透過 pattern 進行路由匹配進行消化。
規則如下:
*代表一個單詞#代表多個單詞Preparation 寓意 主要目的:
- 與
direct很類似,但是他透過 pattern 進行匹配消化;可以比較彈性的進行消化。
- 比方說,log 訊息中會分成不同層度上的錯誤訊息;又或者是從不同的應用程式中接收到訊息。
說明:
Exchange type 設定為 topic,透過 routing key 來進行訊息的路由。
$channel->exchange_declare( exchange: self::EXCHANGE_NAME, // 交換機名稱 type: 'topic', // 交換機類型 allow: fanout|direct|topic|headers passive: false, // 被動,檢查Exchange是否存在, 不存在則報錯 durable: false, // 耐用,是否持久化… 重啟後是否存在 auto_delete: false // 自動刪除,當最後一個消費者取消訂閱時,Exchange是否自動刪除 );$channel->basic_publish( msg: $msg, exchange: self::EXCHANGE_NAME, routing_key: "info.#", // 這裡也要補上 routing_key(pattern) 自定義 );