文章目錄
使用 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 ManagementVirtual host選擇BName設定fromASource URI設定amqp://admin:pass.123@localhost:5672/A- 選擇
Exchange Source exchange選擇testexRouting key設定*Destination URI設定amqp://admin:pass.123@localhost:5672/B- 選擇
Exchange Destination exchange選擇testexRouting 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 台灣 授權條款 釋出。
