Skip to content

RabbitMQ(3)

Published: at 05:09 PM

接續上一篇 RabbitMQ(2)

路由 (Routing)

RabbitMQ-Routing | repository worker

選擇性地接受訊息,只有符合特定條件的消費者才會接收到訊息。

Preparation 寓意 主要目的:

  • 有條件的接收訊息,只有符合特定條件的消費者才會接收到訊息。
    • 比方說,log 訊息中會分成不同層度上的錯誤訊息;而透過此就可以將不同層級的錯誤進行紀錄、通知。

說明:

在程式範例中,使用 direct 來進行訊息的路由,並且透過 routing key 來進行訊息的路由。

多重綁定 (Multiple bindings)

透過多重綁定,可以將多個 queue 綁定到同一個 routing key 上,這樣就可以讓多個 queue 接收到相同的訊息。 multiple-bindings

producer
透過 producer 進行產生任務時,透過 routing key 來進行訊息的路由,並且透過 exchange 來進行訊息的轉發。
$channel->basic_publish(
    message: new AMQPMessage($data),
    exchange: 'direct_logs', // exchange 名稱
    routing_key: $severity // routing key <----- 這邊設定要推送到哪個 routing key
);
consumer
consumer 設定 routing key 來進行訊息的接收,並且透過 exchange 來進行訊息的轉發。
$channel->queue_bind(
    queue: $queue_name, // queue 名稱
    exchange: 'direct_logs', // exchange 名稱
    routing_key: $severity // routing key <----- 這邊設定要接收到哪個 routing key
);

主題 (Topics)

RabbitMQ-Routing | repository worker

透過 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) 自定義
);

Previous Post
REPMGR
Next Post
RabbitMQ(2)