普通模式: 預設模式,以兩個節點(rabbit01、rabbit02)爲例來進行說明。對於Queue來說,訊息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元數據,即佇列的結構。當訊息進入rabbit01節點的Queue後,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit01、rabbit02間進行訊息傳輸,把A中的訊息實體取出並經過B發送給consumer。所以consumer應儘量連線每一個節點,從中取訊息。即對於同一個邏輯佇列,要在多個節點建立物理Queue。否則無論consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。當rabbit01節點故障後,rabbit02節點無法取到rabbit01節點中還未消費的訊息實體。如果做了訊息持久化,那麼得等rabbit01節點恢復,然後纔可被消費;如果沒有持久化的話,就會產生訊息丟失的現象。
映象模式: 把需要的佇列做成映象佇列,存在與多個節點屬於RabbitMQ的HA方案。該模式解決了普通模式中的問題,其實質和普通模式不同之處在於,訊息實體會主動在映象節點間同步,而不是在用戶端取數據時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統效能外,如果映象佇列數量過多,加之大量的訊息進入,叢集內部的網路頻寬將會被這種同步通訊大大消耗掉。所以在對可靠性要求較高的場合中適用。
序號 | IP | 說明 |
---|---|---|
1 | 172.17.88.22 | master |
2 | 172.17.88.19 | salve |
3 | 172.17.88.18 | salve |
修改hosts檔案
vi /etc/hosts
# 新增IP
172.17.88.22 rabbit-node1
172.17.88.19 rabbit-node2
172.17.88.18 rabbit-node3
確保三臺機器25672、5672、4369開通埠,15672介面埠任意伺服器開通一臺
master執行
sudo docker run -d --hostname rabbit-node1 --network host --restart=always --name rabbit-node -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
# 進入容器執行
docker exec -it rabbit-node bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
salve執行
docker exec -it rabbit-node bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit-node1
rabbitmqctl start_app
exit
任意節點設定映象複製
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
spring.rabbitmq.addresses=172.17.88.22:5672,172.17.88.19:5672,172.17.88.18:5672