文章目錄
使用 Shovel Exchange 讓 RabbitMQ 跨 vhost 進行訊息傳遞
這是之前筆記 使用 Federated Exchange 讓 RabbitMQ 跨 vhost 進行訊息傳遞 的延伸,雖然上次已經排除 RabbitMQ 過新的問題,但沒想到在實際使用 Federated Exchange 時,卻遇到 .NET client 在 publish message 時出現 exception 問題,我嘗試使用相同的 RabbitMQ 與 .NET client 版本,仍無法重現錯誤,又不可能無限制的讓環境出現錯誤跟其他同事支援 debug,所以我後來還是用 shovel 來解決問題
做法說明:
- 在兩個 vhost:
A
與B
各自建立一個 topic exchange:testex
- vhost
A
建立q1
,q2
,q3
三個 queue - vhost
B
建立q2
,q3
二個 queue - 將 vhost
A
的q1
(routing key 為1
),q2
(routing key 為2
),q3
(routing key 為3
) 三個 queue 綁定到testex
- 將 vhost
b
的q2
(routing key 為2
),q3
(routing key 為3
) 三個 queue 綁定到testex
- 設定 Shovel Exchange,將
A
的testex
訊息轉傳至B
的testex
中,讓 vhostb
的q2
與q3
可以 mirror 來自 vhostA
的訊息,但放棄q1
的訊息
基本環境說明
- macOS Sequoia 15.1.1 (Apple M2 Pro)
- OrbStack Version 1.8.0 (18332)
- docker image
- rabbitmq:4.0.4-management
docker-compose.yml
RabbitMQ 前置作業
設定方式
啟用 RabbitMQ Federation 相關套件以開啟 Shovel 功能
rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management
使用 web ui
Shovel Management
Virtual host
選擇B
Name
設定fromA
Source URI
設定amqp://admin:pass.123@localhost:5672/A
- 選擇
Exchange
Source exchange
選擇testex
Routing key
設定*
Destination URI
設定amqp://admin:pass.123@localhost:5672/B
- 選擇
Exchange
Destination exchange
選擇testex
Routing key
保持 `` (空白)Add shovel
使用 rabbitmqctl
雖然 ui 上的 destination exchange routing key 是空白,但使用 rabbitmqctl 時,
dest-exchange-key
則不能為空白,否則無法達成想要的效果,直接不要設定即可rabbitmqctl set_parameter --vhost B shovel fromA '{"src-uri":"amqp://admin:pass.123@localhost:5672/A","src-exchange":"testex","src-exchange-key":"*","dest-uri":"amqp://admin:pass.123@localhost:5672/B","dest-exchange":"testex","add-forward-headers":true,"ack-mode":"on-confirm"}'
心得
跟過去使用 shovel 來 mirror queue 不同 (細節可以參考之前筆記 RabbitMQ Shovel 將訊息同步至不同 Vhost (Cluster)),這次改用 shovel exchange,好處是設定方便:針對 exchange 一次搞定,缺點就是精細度不如 queue,但對於想要 mirror 所有 exchange 訊息的需求,這是個不錯的選擇。
參考資訊
文章作者 Yowko Tsai
上次更新 2024-12-24
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。