http://blog.csdn.net/mra__s__/article/details/55011530
理解消息通信
一、 消息通信的概念--消費(fèi)者、生產(chǎn)者和代理
生產(chǎn)者創(chuàng)建消息,消費(fèi)者接受這些消息。你的應(yīng)用程序可以作為生產(chǎn)者,向其他應(yīng)用程序發(fā)送消息,或者作為一個(gè)消費(fèi)者,接收消息。也可以在兩者之間進(jìn)行切換。不過在此之前,它必須先建立一條信道(channel)。不論你是發(fā)布消息、訂閱隊(duì)列或是接受消息都是通過信道完成。
二、 AMQP元素--交換器、隊(duì)列和綁定
從概念上講,AMQP消息路由必須有三部分:交換器、隊(duì)列和綁定。生產(chǎn)者把消息發(fā)布到交換器上;消息最終到達(dá)隊(duì)列,并被消費(fèi)者接受;綁定決定了消息如何從路由器路由到特定的隊(duì)列。在研究交換器和綁定之前,需要先理解隊(duì)列的概念和工作原理。如下圖:

消費(fèi)者通過以下兩種方式從特定隊(duì)列中接收消息:
(1) 通過AMQP的base.consumer命令訂閱。這樣做會(huì)將信道置為接收模式,直到取消對(duì)隊(duì)列的訂閱為止。
(2) 有些時(shí)候,你只想從隊(duì)列中獲取單條消息而不是持續(xù)訂閱。向隊(duì)列請(qǐng)求單條消息是通過AMQP的base.get命令實(shí)現(xiàn)的。大致上講,base.get命令會(huì)訂閱消息,獲取單條消息,然后取消訂閱。消費(fèi)者理應(yīng)始終使用base.consumer來(lái)實(shí)現(xiàn)高吞吐量。
A: 當(dāng)有多個(gè)消費(fèi)者訂閱到同一個(gè)隊(duì)列上是,消息是如何發(fā)布的:
Q: 隊(duì)列收到的消息將以循環(huán)(round-robin)的方式發(fā)送給消費(fèi)者,每條消息只會(huì)發(fā)送給一個(gè)消費(fèi)者。消息確認(rèn)接收機(jī)制:消費(fèi)者必須通過AMQP的base.ask命令顯式的向RabbitMQ發(fā)送一個(gè)確認(rèn)消息,或者在訂閱到隊(duì)列的時(shí)候就將base.ask參數(shù)設(shè)置成true。消費(fèi)者對(duì)消息的確認(rèn)和告訴生產(chǎn)者消息已經(jīng)被接收這兩件事毫不相關(guān)。
如何創(chuàng)建隊(duì)列。生產(chǎn)者和消費(fèi)者都能使用AMQP的base.declare命令創(chuàng)建隊(duì)列。如果消費(fèi)者在同一條信道上訂閱了另一條對(duì)列的話,就無(wú)法再聲明隊(duì)列了。則必須先取消隊(duì)列,將信道置為“傳輸”模式。
隊(duì)列設(shè)置了一些有用的參數(shù):
1.exlusion--將參數(shù)設(shè)置成true后隊(duì)列將變?yōu)樗接校拗埔粋€(gè)隊(duì)列中只能有一個(gè)消費(fèi)者。
2.auto-delete--將參數(shù)設(shè)置為true后,最后一個(gè)消費(fèi)者取消訂閱之后隊(duì)列將自動(dòng)移除。
聯(lián)合:交換器和綁定。
Q: 消息是如何到達(dá)隊(duì)列的呢?
A: 路由鍵規(guī)則來(lái)指定消息從路由器到哪個(gè)隊(duì)列。
Q: 那它是如何處理投遞到多個(gè)隊(duì)列的情況呢?
A: 協(xié)議中定義的不同類型交換器發(fā)揮了作用。一共四種類型:direct、fanout、topic和header。
direct:如果路由鍵匹配的話,消息就被投遞到對(duì)應(yīng)的隊(duì)列。
base_publish($msg,'默認(rèn)交換器','隊(duì)列名稱');

fanout:當(dāng)你發(fā)送一條消息到fanout路由器時(shí),他會(huì)把消息投遞給所有附加在此交換器上的隊(duì)列。可以輕而易舉地添加應(yīng)用程序的功能。
base_publish($msg,'logs-exchange','error.msg-inbox');

topic:跟direct比較相像,有一些通配規(guī)則。單個(gè)“.”把路由分成幾部分,“*”匹配特定位置的任意文本,“#”匹配所有規(guī)則。
queue_bind('msg-inbox-errors','logs-exchange','error.msg-inbox');
queue_bind('msg-inbox-errors','logs-exchange','*.msg-inbox');
queue_bind('all-logs','logs-exchange','#');

三、 虛擬主機(jī)
虛擬主機(jī)vhost是AMQP概念的基礎(chǔ),你必須在連接時(shí)進(jìn)行指定。RabbitMQ包含了開箱即用的默認(rèn)虛擬主機(jī)"/",因此使用非常簡(jiǎn)便。vhost之間是絕對(duì)隔離,保障了隊(duì)列和交換機(jī)的安全性,因此消息路由的組件也無(wú)法進(jìn)行交互。
rabbitmqctl add_vhost[vhost_name]
rabbitmqctl delete _vhost[vhost_name]
四、 消息持久化
重啟rabbitmq服務(wù)器后,那些隊(duì)列和交換器就都消失了,原因在于每個(gè)隊(duì)列和交換器的durable屬性,該屬性默認(rèn)情況為false。如果需要持久化,單純將隊(duì)列和交換器的durable屬性設(shè)置為true是不夠滴。消息發(fā)布之前,通過把它的“投遞模式”(delivery mode)選項(xiàng)設(shè)置為2來(lái)把消息標(biāo)記為持久化。代價(jià)則是消耗性能,雖然重啟RabbitMQ服務(wù)器后隊(duì)列和交換器能恢復(fù)。
五、 一條消息經(jīng)歷從生產(chǎn)者到消費(fèi)者的生命周期
發(fā)布者需要完成的任務(wù):1.連接到RabbitMQ。2.獲取信道。3.聲明交換機(jī)。4.創(chuàng)建消息。5.關(guān)閉消息。6.關(guān)閉信道。7.關(guān)閉連接。
消費(fèi)者需要執(zhí)行的任務(wù):1.連接到RabbitMQ。2.獲取信道。3.聲明交換機(jī)。4.聲明隊(duì)列。5.把隊(duì)列和交換機(jī)綁定起來(lái)。6.消費(fèi)消息。7.關(guān)閉信道。8.關(guān)閉連接。
使用發(fā)送方確認(rèn)模式來(lái)確認(rèn)投遞。
運(yùn)行和管理RabbitMQ
一、 服務(wù)器管理—啟動(dòng)和停止節(jié)點(diǎn)
運(yùn)行子系統(tǒng):rabbitmq安裝目錄下找到./sbin目錄,運(yùn)行./rabbitmq-server。通過日志查看運(yùn)行情況,日志目錄/var/log/rabbitmq/下。以守護(hù)程序的方式在后臺(tái)運(yùn)行:./rabbitmq-server detached,至此rabbitmq服務(wù)啟動(dòng)成功。
當(dāng)運(yùn)行rabbitmq連接到控制臺(tái)時(shí),你按下CTRL+C組合鍵后你猜是哪個(gè)..
在rabbitmq安裝目錄下運(yùn)行./sbin/rabbitmqctl stop來(lái)干凈地關(guān)閉。
rabbitmq配置文件目錄在/etc/rabbitmq/rabbitmq.config。
二、 權(quán)限配置
RabbitMQ權(quán)限工作原理:用戶可以為連接到RabbitMQ主機(jī)的應(yīng)用程序設(shè)計(jì)不同級(jí)別的權(quán)限(讀、寫和“/”或配置)。
管理用戶:在RabbitMQ中,用戶是訪問控制的基本單元。針對(duì)一到多個(gè)vhost,其可以被賦予不同級(jí)別的訪問權(quán)限,并使用標(biāo)準(zhǔn)的用戶名/密碼對(duì)來(lái)認(rèn)證用戶。對(duì)用的增加、刪除以及列出列表,都非常簡(jiǎn)單。這些操作都是通過rabbitmqctl完成的。
添加用戶:rabbitmqctl add_user username password
刪除用戶:rabbitmqctl delete_user username
用戶列表:rabbitmqctl list_users

設(shè)置權(quán)限:rabbitmqctl set_permissions –p sycamore \ cashing-tier “.*” “.*” “.*”
–p sycamore:告訴set_permissions條目應(yīng)該應(yīng)用在哪個(gè)vhost上面。
cashing-tier:被授予權(quán)限的用戶。
“.*” “.*” “.*”:這些是授予的權(quán)限。這些值分別映射到配置、寫和讀。
移除權(quán)限:rabbbimqctl clear_permissions –p sycamore cashing-tier
權(quán)限列表:rabbitmqctl list_user_permissions cashing-tier
三、 使用統(tǒng)計(jì)
其中經(jīng)常看到的-p選項(xiàng),它指明了虛擬主機(jī)和路徑信息。
rabbitmqctl list_queues -p sycamore 列出虛擬主機(jī)為sycamore的隊(duì)列列表
list_queues [-p Vhost_Path] [<QueueInfoItem>]
rabbitmqctl list_exchanges
list_exchanges [ExchangeInfoItem]
rabbitmqctl list_bindings
理解RabbitMQ日志,LOG_BASE=/var/log/rabbitmq
四、 RabbitMQ和Erlang問題疑難解答
由badrpc、nodedown和其他Erlang引起的問題
1. Erlang Cookie
使用rabbitmqctl命令時(shí)常出現(xiàn)一些莫名錯(cuò)誤。先理解下rabbitmqctl的工作原理。rabbitmqctl命令先啟動(dòng)Erlang節(jié)點(diǎn),并從那個(gè)使用Erlang分布式系統(tǒng)嘗試連接RabbitMQ節(jié)點(diǎn)。要完成這項(xiàng)工作需要兩樣?xùn)|西:合適的Erlang Cookie和合適的主機(jī)名稱。
Q: 那么什么是Erlang Cookie呢?
A: Erlang節(jié)點(diǎn)通過交換作為秘密令牌的Erlangcookie以獲得認(rèn)證。Erlang將令牌存儲(chǔ)于home目錄下的.erlang.cookie文件中
2. Erlang節(jié)點(diǎn)
當(dāng)你啟動(dòng)Erlang節(jié)點(diǎn)時(shí),你可以給它兩個(gè)互斥的節(jié)點(diǎn)名選項(xiàng),name和sname。
當(dāng)你想讓rabbitmqctl能夠連上RabbitMQ時(shí),你必須使得這些參數(shù)兩邊都能匹配(rabbit@hostname)。
3. Mnesia和主機(jī)名
RabbitMQ使用Mnesia存儲(chǔ)隊(duì)列、交換器、綁定等信息。RabbitMQ啟動(dòng)時(shí)做的一件事就是啟動(dòng)Mnesia數(shù)據(jù)庫(kù)。如果啟動(dòng)Mnesia失敗,則RabbitMQ也會(huì)跟著失敗。而導(dǎo)致Mnesia失敗的原因大致有二:第一個(gè)也是最常見的MNESIA_BASE目錄的權(quán)限問題。另一個(gè)常見問題是讀取表格失敗。如果主機(jī)名更改了,或是服務(wù)器運(yùn)行在集群模式下,無(wú)法在啟動(dòng)的時(shí)候連接到其他節(jié)點(diǎn),都會(huì)導(dǎo)致啟動(dòng)失敗。
4. Erlang故障排除技巧
以test作為節(jié)點(diǎn)名啟動(dòng)Eralng節(jié)點(diǎn):erl sname test。
執(zhí)行node()函數(shù)會(huì)展示--Erlang中方括號(hào)為界的列表--你連接上的節(jié)點(diǎn)列表。
通過使用rpc:call,同時(shí)提供節(jié)點(diǎn)、模塊、函數(shù)和參數(shù)作為入?yún)ⅲ憧梢栽谶h(yuǎn)程rabbit上執(zhí)行其他參數(shù)以獲取不同的信息。
解決Rabbit相關(guān)問題:編碼與模式
一、 面向消息通信來(lái)設(shè)計(jì)應(yīng)用程序
1. 異步狀態(tài)思維(分離請(qǐng)求和動(dòng)作)
2. 提供擴(kuò)展性:沒有負(fù)載均衡器的世界
3. 使用AMQP來(lái)解耦應(yīng)用程序最大好處:免費(fèi)的API,語(yǔ)言不會(huì)約束消息通信。
二、 消息通信模式
解決耗時(shí)的任務(wù)和整合用不同語(yǔ)言編寫的應(yīng)用程序。這兩個(gè)看似有不同的問題,但卻有著共同的本質(zhì):解耦請(qǐng)求和操作。或者換種說(shuō)法,這兩個(gè)問題均需要從同步編程模式轉(zhuǎn)向異步編程模式。
三、 發(fā)后即忘模型
匹配該模式的兩種一般類型的任務(wù)
1. 批處理(batchprocessing)--針對(duì)大型數(shù)據(jù)集合的工作和轉(zhuǎn)換。這種類型的任務(wù)可以構(gòu)建為單一的任務(wù)請(qǐng)求,或者多個(gè)任務(wù)對(duì)數(shù)據(jù)集合的獨(dú)立部分進(jìn)行操作。
2. 通知(notifications)--對(duì)發(fā)生事件的描述。內(nèi)容可以是消息的日志,也可以是真實(shí)的報(bào)告通知給另一個(gè)程序或者是管理員。
這兩個(gè)例子符合我們之前提到的兩種類別:第一個(gè)是告警框架(發(fā)送告警)。另一個(gè)是將單張圖片上傳并將其轉(zhuǎn)換成眾多圖片格式和尺寸(并行處理)。
四、 用RabbitMQ實(shí)現(xiàn)RPC
1. 私有隊(duì)列和確認(rèn)發(fā)送。
2. 使用reply_to來(lái)實(shí)現(xiàn)簡(jiǎn)單的jsonRPC
集群并處理失敗
一、 RabbitMQ集群架構(gòu)
RabbitMQ最優(yōu)秀的功能之一就是其內(nèi)建集群。同時(shí)能夠?qū)⒓涸?分鐘內(nèi)構(gòu)建并運(yùn)行起來(lái)。
RabbitMQ內(nèi)建集群的設(shè)計(jì)用于完成兩個(gè)目標(biāo):允許消費(fèi)者和生產(chǎn)者在Rabbit節(jié)點(diǎn)奔潰的情況下繼續(xù)運(yùn)行,以及通過添加更多的節(jié)點(diǎn)來(lái)線性擴(kuò)展消息通信吞吐量。
Q: RabbitMQ是如何記錄你所有使用過的各種基礎(chǔ)構(gòu)件,同時(shí)他們又如何裝配成一個(gè)消息通信服務(wù)器的呢?
A: RabbitMQ會(huì)始終記錄以下四種類型的內(nèi)部元數(shù)據(jù):
1. 隊(duì)列元數(shù)據(jù)--隊(duì)列名稱和屬性(是否可持久化,是否自動(dòng)刪除)
2. 交換器元數(shù)據(jù)--交換器名稱、類型和屬性(可持久化等)
3. 綁定元數(shù)據(jù)--一張簡(jiǎn)單的表格展示了如何將消息路由到隊(duì)列
4. vhost元數(shù)據(jù)--為vhost內(nèi)的隊(duì)列、交換器和綁定提供命名空間和安全屬性。
我們深入到集群節(jié)點(diǎn)和他們?nèi)绾未鎯?chǔ)元數(shù)據(jù)前,首先理解在集群環(huán)境中隊(duì)列和交換器的行為。
1. 集群中的隊(duì)列。
2. 分布交換器。
3. 是內(nèi)存節(jié)點(diǎn)還是磁盤節(jié)點(diǎn)。
二、 在你的筆記本上搭建集群
在筆記本上創(chuàng)建三個(gè)節(jié)點(diǎn),然后將三個(gè)節(jié)點(diǎn)集群,具體操作可以參考之前兩篇文章。
三、 使用物理服務(wù)器創(chuàng)建集群
分布在不同的服務(wù)器上創(chuàng)建不同的節(jié)點(diǎn),將不同節(jié)點(diǎn)進(jìn)行集群。

四、 升級(jí)集群節(jié)點(diǎn)
獨(dú)立系統(tǒng)中升級(jí)節(jié)點(diǎn)只需解壓新版本,然后運(yùn)行即可,舊的數(shù)據(jù)也將會(huì)保留。如果是集群節(jié)點(diǎn),需要備份配置信息后,關(guān)閉所有生產(chǎn)者等待消費(fèi)者消費(fèi)完隊(duì)列中的所有信息(rabbitmqctl觀察隊(duì)列狀態(tài))。現(xiàn)在,關(guān)閉節(jié)點(diǎn),并解壓新版本到RabbitMQ到現(xiàn)有的安裝目錄。
五、 與鏡像隊(duì)列一起工作
當(dāng)加入鏡像隊(duì)列后,信道負(fù)責(zé)將消息路由到合適的隊(duì)列。

鏡像隊(duì)列是如何影響事務(wù)和發(fā)送方確認(rèn)模式的?
1. 鏡像隊(duì)列主拷貝故障時(shí),從拷貝變成主拷貝。
2. 如果鏡像隊(duì)列失去一個(gè)從節(jié)點(diǎn)的話,則附加在鏡像隊(duì)列的任何消費(fèi)者都不會(huì)注意到這一點(diǎn)。
3. 如果客戶端庫(kù)不能支持消費(fèi)者取消通知的話,你應(yīng)該避免使用鏡像隊(duì)列。
從故障中恢復(fù)
一、 理解負(fù)載均衡
負(fù)載均衡將服務(wù)器集群IP封裝,提供暴露成統(tǒng)一接口。通過將負(fù)載均衡器放置在Rabbit的前端,你就可以讓它來(lái)處理節(jié)點(diǎn)選擇、故障服務(wù)器檢測(cè)以及負(fù)載分布這些復(fù)雜的事情了。

二、 安裝并配置HAProxy來(lái)為Rabbit做負(fù)載均衡
選擇使用HAProxy的原因:它是免費(fèi)的,而且非常可靠,并且為各種站點(diǎn)處理高負(fù)載,例如:StackOverFlow。同時(shí),它可以運(yùn)行在幾乎所有的基于UNIX的平臺(tái)上,并且非常容易配置。
1. 安裝HAProxy
2. 配置HAProxy
以上兩步自己度娘。
三、 重連并從故障中恢復(fù)
現(xiàn)在開發(fā)系統(tǒng)上運(yùn)行著負(fù)載均衡器,我們準(zhǔn)備深入探索如何使用它來(lái)為消息通信應(yīng)用程序植入故障轉(zhuǎn)移和快速恢復(fù)的能力。
1. 如果我重新連接到新的服務(wù)器,那么我的信道以及其上的所有消費(fèi)循環(huán)會(huì)怎樣呢?它們現(xiàn)在都失效了。你必須對(duì)它們進(jìn)行重建。
2. 當(dāng)我進(jìn)行重連的時(shí)候,我能否假設(shè)所有的交換器、隊(duì)列和綁定仍然存在于集群之中?我能否重連之后立即開始從隊(duì)列消費(fèi)呢?
Warren和Shovel:故障轉(zhuǎn)移和復(fù)制
一、 理解主/備方式(warren)
集群迫使你不得不在以下兩者之間做權(quán)衡:所有節(jié)點(diǎn)表現(xiàn)得像獨(dú)立單元來(lái)分布負(fù)載的優(yōu)點(diǎn),但是在故障節(jié)點(diǎn)恢復(fù)前無(wú)法使用可持久化隊(duì)列的缺點(diǎn)。這正是warren和Shovel的用武之地。
二、 使用負(fù)載均衡器創(chuàng)建warren
基于warren的負(fù)載均衡器的HAProxy配置。基于負(fù)載均衡器來(lái)做故障轉(zhuǎn)移,最重要的是可以確保當(dāng)故障轉(zhuǎn)移發(fā)生時(shí),你無(wú)須擔(dān)心RabbitMQ無(wú)法在備用節(jié)點(diǎn)啟動(dòng),因?yàn)樗呀?jīng)運(yùn)行了。由于Rabbit始終在主節(jié)點(diǎn)和備用節(jié)點(diǎn)上運(yùn)行,因此你們可以始終對(duì)它們進(jìn)行監(jiān)控。如果備機(jī)在派上用場(chǎng)之前就變?yōu)椴豢捎玫脑挘阍诘谝粫r(shí)間就能發(fā)現(xiàn)。這通過使用共享存儲(chǔ)warren是無(wú)法做到的。
三、 使用Shovel構(gòu)建遠(yuǎn)距離復(fù)制
在掌握了集群和warren之后,你就能處理故障并在數(shù)據(jù)中心之上進(jìn)行擴(kuò)展了,但是當(dāng)你需要在不同的數(shù)據(jù)中心的Rabbit間復(fù)制消息時(shí),改怎么辦呢?這時(shí),我們就需要Shovel了。
1. 給Rabbit裝備Shovel:Shovel插件介紹。
2. 安裝Shovel
3. 配置并運(yùn)行Shovel
從Web端管理RabbitMQ
一、 Managent插件相對(duì)于rabbitmqctl腳本的優(yōu)勢(shì)
方便、簡(jiǎn)潔、功能齊全、瀏覽多方面同時(shí)監(jiān)測(cè)。
二、 啟用RabbitMQ Management插件
rabbitmq-plugins enable rabbitmq-management
三、 Management插件功能

四、 從Web控制臺(tái)來(lái)管理用戶、隊(duì)列和交換器
在web控制臺(tái)上做如下操作:(具體結(jié)合界面應(yīng)用)
1. 創(chuàng)建用戶
2. 管理用戶的權(quán)限
3. 列出隊(duì)列信息
4. 創(chuàng)建隊(duì)列
五、 Management插件REST接口介紹
1. 通過使用REST API,你可以輕松自動(dòng)化那些到目前為止只能通過圖形化界面完成的任務(wù)。
2. CLI管理:一種更簡(jiǎn)潔的方式。
3. 安裝rabbitmqadmin腳本。
4. 應(yīng)用rabbitmqadmin腳本。
使用REST API控制Rabbit
一、 Rabbit REST API的限制和功能
不管用API創(chuàng)建隊(duì)列還是設(shè)置權(quán)限,每當(dāng)使用PUT或POST動(dòng)作的時(shí)候,都需要將函數(shù)參數(shù)編碼為JSON格式的哈希表,然后添加到請(qǐng)求正文中。你可以通過瀏覽器訪問http://localhost:55672/api來(lái)查看目前大多數(shù)(以及完整的)API列表和支持的HTTP動(dòng)作。
二、 訪問消息通信數(shù)據(jù)統(tǒng)計(jì)和計(jì)數(shù)器
Rabbit Management API使得你可以在任何能夠訪問網(wǎng)絡(luò)的地方監(jiān)控并控制Rabbit。具體詳情看此書,代碼來(lái)控制的。
三、 自動(dòng)化創(chuàng)建用戶和虛擬主機(jī)
我們?cè)诓渴饝?yīng)用時(shí),就使用了相似的腳本來(lái)自動(dòng)化創(chuàng)建用戶。通過構(gòu)造這段腳本,你不僅學(xué)習(xí)了如何使用Management API來(lái)展示條目,還學(xué)習(xí)了如何展示條目列表,以及如何創(chuàng)建和刪除這些條目。你這樣將這些概念應(yīng)用到處理其他條目/資源類型(用戶、隊(duì)列、交換器、連接、權(quán)限等)。具體腳本看此書。
監(jiān)控
一、 編寫Nagios健康檢測(cè)的基礎(chǔ)
Nagios健康檢測(cè)是一個(gè)獨(dú)立程序,它在運(yùn)行時(shí)監(jiān)控服務(wù)并在程序停止運(yùn)行時(shí)退出代碼來(lái)指示服務(wù)的健康狀態(tài)。從技術(shù)上來(lái)講,你甚至不需要Nagios來(lái)運(yùn)行健康檢測(cè)--你可以在任何時(shí)候通過命令行執(zhí)行并手工觀測(cè)輸出。Nagios健康檢測(cè)可以用任何語(yǔ)言編寫,可以是Python程序,甚至是BASE腳本。
二、 使用AMQP和REST API來(lái)監(jiān)控Rabbit內(nèi)部狀態(tài)
構(gòu)建的AMQP健康檢測(cè),當(dāng)下列任務(wù)條件之一為真時(shí),該檢測(cè)程序會(huì)返回一個(gè)critical狀態(tài)
1. RabbitMQ沒有響應(yīng)TCP連接。
2. 當(dāng)發(fā)送AMQP命令時(shí),Pika在接收到響應(yīng)之前超時(shí)了。
3. 當(dāng)構(gòu)造AMQP信道時(shí),遇到了協(xié)議錯(cuò)誤。
僅當(dāng)這些狀態(tài)檢測(cè)都為false時(shí),健康檢測(cè)程序才會(huì)返回OK狀態(tài)。
基于API的健康檢測(cè),aliveness-test,顧名思義,使用三個(gè)步驟來(lái)驗(yàn)證Rabbit服務(wù)器是否健康:
1. 創(chuàng)建一個(gè)隊(duì)列來(lái)接收測(cè)試消息。
2. 用隊(duì)列名稱作為消息路由鍵,將消息發(fā)往默認(rèn)交換器。
3. 當(dāng)消息到達(dá)隊(duì)列的時(shí)候就消費(fèi)該消息;否則就報(bào)錯(cuò)。
三、 使用Rabbit可用并且能夠進(jìn)行響應(yīng)
有許多原因會(huì)致使RabbitMQ使用太多的內(nèi)存,并達(dá)到Rabbit配置的最大內(nèi)存上限。以下是最常見的幾種原因:
1. 應(yīng)用程序有缺陷,消費(fèi)消息之后忘記向RabbitMQ發(fā)回確認(rèn)消息。這在高容量環(huán)境下,會(huì)導(dǎo)致成千上萬(wàn)條的消息堆積并耗盡Rabbit的內(nèi)存。
2. 應(yīng)用程序使用RabbitMQ將大型數(shù)據(jù)(譬如圖像)路由到處理節(jié)點(diǎn)。用不了多少?gòu)?00MB大小的圖像就可以將只有8GB內(nèi)存大小的服務(wù)器內(nèi)存耗盡。
3. 使用了最新RabbitMQ版本中的新功能,但是該功能有個(gè)BUG會(huì)導(dǎo)致緩慢的內(nèi)存泄漏。
四、 觀察隊(duì)列狀態(tài)以盡早檢測(cè)消費(fèi)者問題
監(jiān)控消費(fèi)者是否正確運(yùn)作的方式就是通過監(jiān)控隊(duì)列的消息總數(shù),并在總數(shù)超過設(shè)定的warning或者critical閾值時(shí)觸發(fā)警告。以下通過兩種方式來(lái)監(jiān)控隊(duì)列消息總數(shù):
1. 使用AMQP的queue_declare()命令,設(shè)置passive=true參數(shù)來(lái)重新聲明一個(gè)已存在的隊(duì)列。當(dāng)你在AMQP中聲明一個(gè)隊(duì)列時(shí),如果將passive設(shè)置為true的話,那么該命令返回的結(jié)果中將包含隊(duì)列消息的總數(shù)。
2. 利用我們的老朋友RabbitManagement API來(lái)總隊(duì)列上拉取數(shù)據(jù)統(tǒng)計(jì),其中就有隊(duì)列當(dāng)前的消息總數(shù)。
五、 檢測(cè)消息通信結(jié)構(gòu)中不合需求的配置更改
確保消費(fèi)者正常工作,檢查消息通信結(jié)構(gòu)配置問題:
1. 通過AMQP監(jiān)控隊(duì)列等級(jí)。
2. 使用REST API來(lái)監(jiān)控隊(duì)列級(jí)別。
3. 建立隊(duì)列的消息計(jì)數(shù)基準(zhǔn)經(jīng)驗(yàn)法則。
提升性能,保障安全
一、 交換器、隊(duì)列和綁定的內(nèi)存占用
根據(jù)數(shù)據(jù)顯示隊(duì)列、交換器和綁定的內(nèi)存占用很小,另一個(gè)施加在RabbitMQ上的硬性限制是每個(gè)Erlang節(jié)點(diǎn)的最大Erlang進(jìn)程數(shù)。Erlang應(yīng)用程序在整個(gè)生命周期中會(huì)多次創(chuàng)建并銷毀進(jìn)程。
二、 消息持久化和磁盤I/O
當(dāng)發(fā)布消息時(shí),你需要決定丟失其中的任何消息對(duì)你來(lái)說(shuō)是否可以接受,這決定了deleverymode設(shè)置的值為1(非持久化)還是2(持久化)的問題。
在消息消費(fèi)過程中你該如何配置,加快消息投遞的設(shè)定是no-ack標(biāo)記,你可以在隊(duì)列訂閱時(shí)指明。
路由算法和綁定規(guī)則,三種不同類型的交換器:direct、fanout和topic。每種交換器類型代表了服務(wù)器實(shí)現(xiàn)的特定路由算法。綁定規(guī)則的路由鍵模式將更占用內(nèi)存。

本節(jié)介紹了不同的算法和消息發(fā)布訂閱設(shè)置如何影響整個(gè)系統(tǒng)的速度,以及像auto-ack模式標(biāo)記設(shè)定能在很大程度上影響系統(tǒng)性能。
三、 RabbitMQ的SSL連接及設(shè)置私鑰架構(gòu)
1. SSL證書。
2. 設(shè)置證書頒發(fā)機(jī)構(gòu)。
3. 生成根證書。
4. 生成服務(wù)器端證書。
5. 生成客戶端證書。
6. 啟用RabbitMQ的SSL監(jiān)聽。
7. 測(cè)試你的RabbitMQ SSL設(shè)置。
聰明的Rabbit:擴(kuò)展RabbitMQ
一、 安裝RabbitMQ插件
我可以通過安裝插件的方式來(lái)解決:
1. 支持AMQP以外的協(xié)議。
2. 不同的認(rèn)證機(jī)制(LDQP,自定義數(shù)據(jù)庫(kù))。
3. 消息復(fù)制。
4. 新的交換器和路由算法。
5. 消息日志和審計(jì)。
如果你想啟用的插件不是服務(wù)器發(fā)行的一部分該怎么辦呢?首先,你得下載插件的.ez文件到RabbitMQ安裝目錄的plugins文件夾下,之后像往常一樣運(yùn)行./rabbitmq-plugins enable plugin_name命令即可。
二、 實(shí)現(xiàn)自定義交換器插件
1. 將交換器注冊(cè)到Rabbit。
2. 實(shí)現(xiàn)交換器behaviour。
3. 編譯自定義交換器。
4. 測(cè)試你的插件。
posted on 2017-12-15 14:09
思月行云 閱讀(1636)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
分布式\MQ