在本章節(jié)中我們將覆蓋:
- 創(chuàng)建一個本地服務(wù)器集群
- 創(chuàng)建一個簡單集群
- 自動添加一個RabbitMQ 集群
- 引入消息負(fù)載均衡器
- 創(chuàng)建集群客戶端
介紹
RabbitMQ提供了各種各樣的特性以及集群功能.
通過使用集群,一組適當(dāng)配置的主機(jī)的行為與單個broker實(shí)例一樣,但集群帶有下面的目的:
- 高可用性: 如果一個節(jié)點(diǎn)宕機(jī)了,分布式broker仍然能接受和處理消息.這方面內(nèi)容會在Chapter 7,Developing High-availability Applications中深入探討.
- 可伸縮的消息負(fù)載:消息路由在集群節(jié)點(diǎn)間是分布式的.
- 連接客戶端的伸縮性:每個節(jié)點(diǎn)都可以用來處理可用客戶端的某部分子集.
TIP
RabbitMQ集群節(jié)點(diǎn)應(yīng)該在LAN內(nèi). RabbitMQ 集群不能很好的容忍網(wǎng)絡(luò)分化,因?yàn)榫W(wǎng)絡(luò)分化期間,每個節(jié)點(diǎn)都是單獨(dú)工作的,目前還沒有機(jī)制來防止所謂的"split-brain syndrome" (可在 http://en.wikipedia.org/wiki/Consensus_(computer_science)找到解決這個問題的參數(shù)).在本地網(wǎng)絡(luò)中, RabbitMQ使用短超時來確定兄弟節(jié)點(diǎn)的可用性。更多信息,可參考http://www.rabbitmq.com/nettick.html.
RabbitMQ集群中所有節(jié)點(diǎn)除了隊(duì)列外,可以共享虛擬主機(jī),用戶,交換器的定義,物理上它們只存在于創(chuàng)建的節(jié)點(diǎn)內(nèi). 另一方面,它們是全局定義的,可通過集群的任何節(jié)點(diǎn)進(jìn)行連接。
如果一個客戶端從還沒有創(chuàng)建隊(duì)列的節(jié)點(diǎn)上生產(chǎn)或消費(fèi)消息,其性能會降低,因?yàn)榭蛻舳诵枰鄠€跳躍才能到達(dá)物理上持有隊(duì)列的節(jié)點(diǎn)。
TIP
默認(rèn)情況下,隊(duì)列不會在集群節(jié)點(diǎn)間復(fù)制,因此當(dāng)出現(xiàn)節(jié)點(diǎn)故障時,你可能會丟失數(shù)據(jù).可參考Chapter 7, Developing High-availability Applications 來解決這個問題。
在章節(jié)中,我們將展示RabbitMQ集群伸縮性方面的例子,同時也會展示設(shè)計(jì)集群AMQP客戶端的正確方法.
創(chuàng)建一個本地服務(wù)器集群
本地集群指的是在同一臺主機(jī)上將多個RabbitMQ實(shí)例以單一集群的方式進(jìn)行配置。
實(shí)際上,在產(chǎn)品環(huán)境中,通常來說,這沒有多大用處,因?yàn)?/span>它不提供任何可伸縮性和可靠性改進(jìn). 然而,創(chuàng)建本地集群來測試配置是相當(dāng)用的,如:開發(fā)PC。
準(zhǔn)備
為了付諸實(shí)施,我們需要安裝有RabbitMQ,并能正常運(yùn)行。即使嚴(yán)格上意義來不是必要的,我們也會安裝管理插件,就如Chapter 3, Managing RabbitMQ中展示的一樣.在這種情況下,我們需要為每個broker指定不同的web控制臺TCP端口.
如何做
要創(chuàng)建一個本地集群,我們需要執(zhí)行下面的步驟:
1. 從root shell (Linux)中,使用下面的命令來啟動另一個RbbitMQ實(shí)例:
env RABBITMQ_NODENAME=node01 RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]"
rabbitmq-server -detached
2. 使用下面的命令將此實(shí)例加入到默認(rèn)那個節(jié)點(diǎn):
rabbitmqctl -n node01 stop_app
rabbitmqctl -n node01 join_cluster rabbit@$HOSTNAME
rabbitmqctl -n node01 start_app
3. 使用下面的命令來檢查運(yùn)行的集群狀態(tài):
rabbitmqctl cluster_status
4. 使用下面的命令退出集群,并回歸到單獨(dú)節(jié)點(diǎn)狀態(tài):
rabbitmqctl -n node01 stop_app
rabbitmqctl -n node01 reset
rabbitmqctl -n node01 start_app
如何工作
通過覆蓋某些配置選項(xiàng),可在同臺機(jī)器上運(yùn)行多個RabbitMQ 服務(wù)器實(shí)例. 尤其是在已經(jīng)安裝了broker的情況下,新安裝的broker必須強(qiáng)制指定不同的broker端口(默認(rèn)為5672)以及管理插件端口(默認(rèn)為15672)。
這可以通過修改環(huán)境變量來完成(步驟1).目前,可用的RabbitMQ環(huán)境變量如下:
- RABBITMQ_MNESIA_BASE
- RABBITMQ_LOG_BASE
- RABBITMQ_NODENAME
- RABBITMQ_NODE_IP_ADDRESS
- RABBITMQ_NODE_PORT
你可以在shell提示窗口中,輸入下面的命令來查看rabbitmqserver指南頁面中所有前面變量的詳細(xì)描述:
man rabbitmq-server
在這里,我們設(shè)置了node名稱,TCP端口,以及一些自定義參數(shù):
RABBITMQ_NODENAME=node01
RABBITMQ_NODE_PORT=5673
RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]"
TIP 在Windows中,步驟1中的命令可通過在命令行中進(jìn)行設(shè)置.你可以將下面的腳本拷貝到一個.bat文件中來達(dá)到此目的:
set RABBITMQ_NODENAME=%1
set RABBITMQ_NODE_PORT=%2
set RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,%3}]" "SBIN_FULL_PATH_HERE\rabbitmq-server" -detached
此時,第二臺服務(wù)器相對于第一臺服務(wù)器來說,仍然是獨(dú)立運(yùn)行的。我們必須運(yùn)行步驟2中的三個命令,這樣兩個服務(wù)器才會綁定到同一個集群中。
TIP
在 Windows中,你需要使用 %COMPUTERNAME% 來代替$HOSTNAME.
通過在集群環(huán)境中運(yùn)行提供的例子,你可以很容易地進(jìn)行檢查.節(jié)點(diǎn)上創(chuàng)建的以及代碼中使用的交換器將會復(fù)制到新添加的節(jié)點(diǎn)上,反之亦然. 可單獨(dú)訪問http://localhost:15672 和 http://localhost:15673 管理插件來了解此種情況。
另外, 你也可以使用-n選項(xiàng)來指定特定節(jié)點(diǎn)來執(zhí)行rabbitmqctl命令,就像步驟2和步驟4中展示的一樣.
如果你不使用-n選項(xiàng),命令會直接在默認(rèn)rabbitmq節(jié)點(diǎn)上執(zhí)行.
更多
兩個節(jié)點(diǎn)神奇般地可以互相說話了,這要多虧它們共享了相同的Erlang cookie,因?yàn)樗鼈冊谕慌_機(jī)器上.
事實(shí)上,多個不同RabbitMQ實(shí)例與任何Erlang分布式程序一樣,都會使用基本認(rèn)證方案.兩個應(yīng)用程序?qū)嵗芟嗷ネㄐ牛鼈儽仨氂邢嗤?span style="background-color: inherit;">Erlang cookie(一個包含任意數(shù)據(jù)的文件).它可以是字符串,GUID,或者是你能想到的任何東西.
TIP
Erlang cookie事實(shí)是上一個密鑰,如果沒有適當(dāng)?shù)谋Wo(hù), Erlang則不允許使用,并且不會工作.你可以為其設(shè)置適當(dāng)?shù)臋?quán)限,如下所示:
chmod 400 .erlang.cookie
你可在http://www.erlang.org/doc/getting_started/conc_prog.html#id67454找到更多關(guān)于Erlang cookies的信息.
在不同主機(jī)上搭建集群中,必須強(qiáng)制性在各個主機(jī)上使用相同的Erlang cookie,在后續(xù)食譜中我們將看到這方面的內(nèi)容。
創(chuàng)建一個簡單集群
設(shè)置一個RabbitMQ集群也就是幾分鐘的事情,只需要配置幾個步驟,高可用集群就可以部署運(yùn)行。
事實(shí)上,相對于本地集群,它更容易,可參考創(chuàng)建本地集群食譜,因?yàn)槊總€節(jié)點(diǎn)都會使用標(biāo)準(zhǔn)端口設(shè)置.
準(zhǔn)備
要準(zhǔn)備此食譜,你至少需要安裝在兩臺主機(jī)上安裝RabbitMQ實(shí)例,并將它們配置為獨(dú)立broker.
TIP
要使集群能正常工作,必須確保所有主機(jī)上的RabbitMQ和Erlang是一致的.
主機(jī)可以是物理機(jī),也可以是云實(shí)例,還可以是虛擬機(jī)器.
TIP
Amazon Web Services (AWS) 預(yù)先安裝的RabbitMQ通常都是過期的,我們建議安裝主流的Linux AMI,然后安裝最新的RabbitMQ版本,可參考(http://www.rabbitmq.com/download.html).
如何做
在下面的步驟中,我們將節(jié)點(diǎn)命名為node01, node02, node03.作為一種選擇,你可以使用你當(dāng)前的主機(jī)名稱,從而可以越過步驟1到4.
1. 如果節(jié)點(diǎn)已經(jīng)運(yùn)行,通過下面的命令來停止RabbitMQ server:
service rabbitmq-server stop
2. 在node01上, 在/etc/hosts中追加所有IP名稱綁定,如下所示(將你的IP地址放在這里):
10.0.0.1 node01
10.0.0.2 node02
...
3. 從node1中拷貝下面的文件到所有其它節(jié)點(diǎn)上,以保證有相同的主機(jī)名稱定義:
scp /etc/hosts 10.0.0.2:/etc/hosts
scp /etc/hosts 10.0.0.3:/etc/hosts
...
4. 在所有節(jié)點(diǎn)上設(shè)置本地主機(jī)名稱(每個服務(wù)器都設(shè)為不同的主機(jī)名稱):
echo node01 > /etc/hostname
hostname –F /etc/hostname
然后,我們配置RabbitMQ.
5. 從node01中拷貝RabbitMQ Erlang cookie到其它所有節(jié)點(diǎn)上:
scp /var/lib/rabbitmq/.erlang.cookie node02:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie node03:/var/lib/rabbitmq/.erlang.cookie
...
6. 重啟所有節(jié)點(diǎn)上的RabbitMQ server:
service rabbitmq-server start
7. 將所有節(jié)點(diǎn)加入到node01.在除node01的所有節(jié)點(diǎn)上,運(yùn)行下面的命令:
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@node01
rabbitmqctl start_app
此時,集群已能正常運(yùn)行了.我們可以執(zhí)行一些更多的命令:
1. 檢查集群狀態(tài):
rabbitmqctl cluster_status
2. 修改node02的節(jié)點(diǎn)類型:
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
rabbitmqctl stat_app
3. 讓集群忘了node02,它是從node01來執(zhí)行的:
rabbitmqctl forget_cluster_node rabbit@node02
4. 讓刪除的node02忘記其集群狀態(tài).在node02上使用下面的命令:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
如何工作
集群中的所有服務(wù)器必須通過主機(jī)名來互相感知,這是很重要的,因?yàn)镮P地址對于RabbitMQ來說還不夠。因此,你必須為所有服務(wù)器配置/etc/hosts (或者配置windows中類似的hosts文件。
TIP
所有節(jié)點(diǎn)都需要使用短主機(jī)(short hostnames)來尋址. 如果你試圖使用全限定域名(FQDN), RabbitMQ可能不能正常工作。
使用外部名稱服務(wù)器也是可以的,但在這種情況下,集群需要對它進(jìn)行依賴. 通常的慣例是在集群的前端設(shè)置了一個名稱服務(wù)器,并依賴靜態(tài)主機(jī)信息來配置集群。
在所有節(jié)點(diǎn)配置之后,需要對它們進(jìn)行同步,以在其它服務(wù)器上共享同一個cookie. cookie文件可包含任意的字符串,以在節(jié)點(diǎn)間實(shí)現(xiàn)簡單地相互認(rèn)證。(步驟5)
TIP
通過指定-n選項(xiàng),也可以配置Erlang cookie來讓rabbitmqctl與遠(yuǎn)程節(jié)點(diǎn)一同工作.
此時,可能過下面的命令來創(chuàng)建集群:
rabbitmqctl join_cluster --ram rabbit@node01
如果我們正確地執(zhí)行了所有步驟,我們可以得到下面的輸出:
Clustering node rabbit@node02 with rabbit@node01 ...
...done.
通過使用 --ram 選項(xiàng),我們將RabbitMQ 節(jié)點(diǎn)類型聲明為RAM.RAM類型的節(jié)點(diǎn)不會在磁盤上保存信息,它只是比磁盤節(jié)點(diǎn)(默認(rèn)節(jié)點(diǎn)類型)更快速.
在RabbitMQ集群的介紹中,至少在集群中有一個節(jié)點(diǎn)的類型為磁盤節(jié)點(diǎn).這樣,在服務(wù)器重啟或某個磁盤節(jié)點(diǎn)出現(xiàn)故障時,所有配置(交換器,隊(duì)列等)才會安全。
TIP
實(shí)際上,由于你已在所有節(jié)點(diǎn)上拷貝了Erlang cookies,因此你可以通過-n選項(xiàng),可在node01上來執(zhí)行指定節(jié)點(diǎn)上的所有操作:
rabbitmqctl -n rabbit@node02 stop_app
rabbitmqctl -n rabbit@node02 join_cluster rabbit@node01
rabbitmqctl -n rabbit@node02 start_app
更多
為了大型集群上準(zhǔn)備這種配置,通常最佳實(shí)踐是使用分布式shell前端.
最初, dsh只能應(yīng)用于IBM AIX,但在現(xiàn)代的Linux系統(tǒng)中,你可以找到pdsh和pdcp (通常在pdsh包中)命令來執(zhí)行同樣的操作。
你也可以在老的或window上使用相似的前端工作(如dancer工具:http://www.netfort.gr.jp/~dancer/software/dsh.html.en).
另外,你也可以使用你喜歡的集群管理軟件來執(zhí)行相同的操作.
也可參考
你可在http://www.rabbitmq.com/clustering.html找到更多關(guān)于集群指南的信息.
自動添加一個RabbitMQ集群通常情況下,當(dāng)服務(wù)器啟動時,我們需要準(zhǔn)備加入集群的操作系統(tǒng)鏡像.通過一些腳本,我們可以很容易地實(shí)現(xiàn)這種任務(wù),但RabbitMQ提供了更簡單的更優(yōu)雅的方法。在本食譜中,我們將進(jìn)行介紹。
準(zhǔn)備
為了準(zhǔn)備這個食譜,我們至少兩臺已經(jīng)安裝RabbitMQ的主機(jī),并將它們配置為獨(dú)立broker.同時,這些主機(jī)還應(yīng)該有相同版本的RabbitMQ 和 Erlang.
如何做
在本食譜中,我們啟動了兩個高可用性RabbitMQ核心broker,它們滿足集群正常工作,具備高可靠性的最小條件 。然后,我們將其它所有節(jié)點(diǎn)配置為自動配置(通過在rabbitmq.config文件中編寫配置)。
1. 配置服務(wù)器主機(jī)名已在Creating a simple cluster 食譜的步驟1 到 4中看過了.
2. 為所有服務(wù)器配置相同的Erlang cookie.
3. 在節(jié)點(diǎn)node01和node02上啟動RabbitMQ,并根據(jù)它們來創(chuàng)建一個集群,正如前面食譜中看過的.
4.如果節(jié)點(diǎn)已經(jīng)被使用了,重設(shè)所有其它節(jié)點(diǎn)并停止,就像下面這樣:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
5. 在所有其它節(jié)點(diǎn)上,設(shè)置RabbitMQ配置文件rabbitmq.config內(nèi)容(最后的圓點(diǎn)是配置文件的一部分):
[{rabbit,
[{cluster_nodes, {['rabbit@node01', 'rabbit@node02'],
ram}}]}].
6. 在所有節(jié)點(diǎn)上重啟RabbitMQ,如下所示:
service rabbitmq-server start
如何工作
這種配置最適合在預(yù)先部署OS鏡像和RabbitMQ. 這些鏡像可以在不傷害現(xiàn)有集群的情況下進(jìn)行部署和使用.
RabbitMQ在啟動時,會讀取 rabbitmq.config文件. RabbitMQ將忽略該節(jié)點(diǎn)的集群自動配置,除非它是一個完全干凈的狀態(tài), 也就是要啟用集群自動配置,需要滿足下面兩個條件中的任何一個:
- RabbitMQ實(shí)例已經(jīng)被重置和停止,正如步驟4中所展示的一樣
- RabbitMQ實(shí)例已經(jīng)安裝且從沒有啟動過
在后一種情況中,你不需要執(zhí)行步驟6,只需要將RabbitMQ配置文件放置到正確的位置,然后再啟動RabbitMQ (如果我們是以鏡像方式來運(yùn)行的,那么它將在服務(wù)器啟動時,自動運(yùn)行),隨后游戲就結(jié)束了。
TIP
默認(rèn)的RabbitMQ配置文件稱為rabbitmq.config,其位置根據(jù)安裝時配置是變化的.下面是典型的位置:
- /etc/rabbitmq/ (大多數(shù)分發(fā)是這樣)
- Rabbitmqdir/etc/rabbimq/ (Mac OSX)
- %APPDATA%\RabbitMQ\ (Windows)
一旦節(jié)點(diǎn)啟動了,它就會重復(fù)地嘗試連接指定節(jié)點(diǎn),作為步驟5中列表節(jié)點(diǎn)元組的第一個元素.只要它成功連上了節(jié)點(diǎn)列表中的一個,它就會以RAM節(jié)點(diǎn)加入到集群中,即作為元組的第二個元素 (或者你也可以指定一個磁盤節(jié)點(diǎn)).
介紹消費(fèi)者負(fù)載均衡器
為了有一個多節(jié)點(diǎn)的RabbitMQ集群, clients必須知道所有的IP地址,如果集群配置是動態(tài)的,clients應(yīng)該收到任何變化的通知。
此外, clients可以使用一些方法聯(lián)系很少負(fù)載的clients.
通常的解決方案是在集群的前端增加一個負(fù)載均衡器.
負(fù)載均衡器可以硬件解決方案或軟件包,可在一般器上進(jìn)行安裝和配置.而且,也有多種不同的負(fù)載均衡技術(shù), 下面是最相關(guān)的:
- Round-robin name servers
- TCP load balancers
TCP 負(fù)載均衡器可作為:
- Proxy: 在這種情況下,所有連接的接受和執(zhí)行都在負(fù)載均衡器自身上執(zhí)行
- Direct Server Return (DSR): 只接受連接的初始化 (SYN),然后讓客戶端與服務(wù)器在后端直接連接,而不再進(jìn)行干預(yù)(明顯的優(yōu)勢在于伸縮性和性能)
這并不是全部,但更深入的細(xì)節(jié)已經(jīng)超出了本書的范圍. 針對我們的目的來說,我們會使用TCP 軟件負(fù)載均衡器-Crossroads (http://crossroads.e-tunity.com/).
當(dāng)其安裝后,clients將會對它進(jìn)行連接,它會將連接轉(zhuǎn)發(fā)到后端RabbitMQ服務(wù)器,正如下圖所示:

準(zhǔn)備
在本食譜中,我們需要三臺機(jī)器;兩臺用于RabbitMQ集群,一個用于安裝負(fù)載均衡器.
在這種情況下,如果clients是從Internet發(fā)起連接的話,前面兩臺服務(wù)器不需要公網(wǎng)IP地址,負(fù)載均衡器有公網(wǎng)IP就足夠了.
如何做
在這個例子中,我們采用了兩個Linux Debian (IP為 192.168.10.2、192.168.10.3) 來作 RabbitMQ服務(wù)器,一臺Linux Centos作Crossroads (with IP 192.168.10.1).
使用兩臺機(jī)器來創(chuàng)建 RabbitMQ集群的例子,我們已經(jīng)在創(chuàng)建簡單集群食譜中看過了.
下面的步驟只針對Centos 機(jī)器(192.168.10.1):
1. 為了編譯Crossroads, 你需要 C++ 編譯器和GNU make. 同時你也需要系統(tǒng)標(biāo)準(zhǔn)C包;執(zhí)行下面的命令來準(zhǔn)備機(jī)器:
yum groupinstall "Development Tools"
2. 然后, 執(zhí)行wget http://crossroads.e-tunity.com/downloads/crossroads-stable.tar.gz 下載最新的Crossroads的穩(wěn)定版本到你的源碼目錄中(如: /usr/local/src/),
3. 使用下面的解壓命令:
tar xvzf crossroads-stable.tar.gz
4. 進(jìn)入解壓目錄,cd crossroads-2.74, 執(zhí)行make install, 然后等待… 最后會出現(xiàn)下面的截屏:

5. 為RabbitMQ配置負(fù)載均衡器:
xr -v --server tcp:0:5672 --backend 192.168.10.2:5672 --backend 192.168.10.3:5672 2>&1 >> /var/log/xr-rmq.log &
6. 如果你啟用了RabbitMQ web管理插件(參考 Chapter 3,Managing RabbitMQ),你也可以為其創(chuàng)建一個負(fù)載均衡器:
xr -v --server tcp:0:80 --backend 192.168.10.2:15672 --backend 192.168.10.3:15672 2>&1 >> /var/log/xr-web.log &
7. 在瀏覽器中打開http://192.168.10.1.
如何工作
在創(chuàng)建簡單集群之后(步驟1),我們安裝并配置了負(fù)載均衡器;對于Crossroads,我們假設(shè)你使用的是Centos Linux distribution.跟隨步驟2到5,你可以編譯和安裝Crossroads, 然后你可以配置負(fù)載均衡器角色。最初,我們使用下面的命令來運(yùn)行crossroads的負(fù)載均衡器(步驟6):
xr -v --server tcp:0:5672 --backend 192.168.10.2:5672
--backend 192.168.10.3:5672
2>&1 >> /var/log/xr-rmq.log &
xr –v server tcp:0:5672命令將5672端口(RabbitMQ默認(rèn)TCP端口)與服務(wù)器TCP監(jiān)聽器進(jìn)行了關(guān)聯(lián), --backend 參數(shù) 用于重定向連接,在我們這里,將會重定向到192.168.10.2:5672 and 192.168.10.3:5672.
我們使用>>/var/log/xr-rmq.log將輸出寫到日志文件中.
為了從負(fù)載均衡器訪問web管理插件,在步驟7中,我們使用15672端口又執(zhí)行另一個XR服務(wù)器.
Crossroads 可使用不同的分發(fā)算法,但默認(rèn)情況下,它使用簡單的 round-robin 算法,這就是說,連接會均勻地重定向到每個后端服務(wù)器上。
此時,你可以使用crossroadsIP代替服務(wù)器IP地址來運(yùn)行任何的RabbitMQ client示例.連接會自動地轉(zhuǎn)發(fā)到后端brokers上.
在下章節(jié)中,我們將看到負(fù)載均衡器的使用和其它高可用方案.
更多
Crossroads是簡單地Linux負(fù)載均衡器,可參考http://crossroads.etunity.com/documentation.xr 來了解全部信息。 另一種廣泛地負(fù)載均衡方案是HAProxy (http://haproxy.1wt.eu/)
也可參考
可閱讀章節(jié)-從客戶端來連接集群(http://www.rabbitmq.com/clustering.html)來了解詳情.
創(chuàng)建集群客戶端
當(dāng)你創(chuàng)建了簡單集群后,客戶端需要指定多個broker地址來連接broker.在本食譜中,我們將看到在RabbitMQ Java client中,如何使用多個地址來連接broker.
注意:與集群前端負(fù)載均衡器不同,在那里并不需要指定多個地址,只需要指定前端均衡器地址即可。
準(zhǔn)備
你需要Java 1.6+和Apache Maven.
如何做
首先,你需要一個簡單集群.
然后,你可以使用下面的代碼來進(jìn)行連接:
Address[] addrArr = new Address[]{ new Address("node01",portnode1), new Address("node02", portnode2)};
connection = factory.newConnection(addrArr);
如何工作
在RabbitMQ包中,你可以傳遞多個host/IP給連接工廠.這種特性可用于小型和大型場景.例如,如果你有兩個節(jié)點(diǎn),并且你想避免使用DNS或負(fù)載均衡器,那么你可以直接在client中傳遞所有的broker地址. client會嘗試連接第一個地址,如果第一個地址連接失敗,client會在不拋出異常的情況下,繼續(xù)嘗試連接下一個地址。
同樣的方案可應(yīng)用于更為復(fù)雜的架構(gòu).如,假設(shè)你有下面兩個主機(jī):
- myrmqcluster_production.internal.com
- myrmqcluster_maintenance.internal.com
客戶端總是會連接production系統(tǒng),但如果production 系統(tǒng)正在維護(hù),clients會連接第二個地址.
更多 實(shí)際上,在沒有RabbitMQ集群的情況下,你也可以使用這種連接方法.在源碼Chapter06/Recipe06中,我們創(chuàng)建了一種虛擬算法來負(fù)載連接。 在這種情況下,你完全可以構(gòu)建兩個獨(dú)立的RabbitMQ實(shí)例.
也可參考
在下面的章節(jié)中,我們將看到如何通過混合集群,HA策略,客戶端技術(shù)來創(chuàng)建一個HA client.
posted on 2016-06-15 20:54
胡小軍 閱讀(1947)
評論(2) 編輯 收藏 所屬分類:
RabbitMQ