• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Fork me on GitHub
            隨筆 - 215  文章 - 13  trackbacks - 0
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345


            專注即時(shí)通訊及網(wǎng)游服務(wù)端編程
            ------------------------------------
            Openresty 官方模塊
            Openresty 標(biāo)準(zhǔn)模塊(Opm)
            Openresty 三方模塊
            ------------------------------------
            本博收藏大部分文章為轉(zhuǎn)載,并在文章開頭給出了原文出處,如有再轉(zhuǎn),敬請(qǐng)保留相關(guān)信息,這是大家對(duì)原創(chuàng)作者勞動(dòng)成果的自覺尊重!!如為您帶來(lái)不便,請(qǐng)于本博下留言,謝謝配合。

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            相冊(cè)

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 216741
            • 排名 - 118

            最新評(píng)論

            閱讀排行榜

            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
            香蕉久久夜色精品升级完成| 国产精品成人精品久久久| 久久综合久久综合九色| 久久99精品久久久久久| 国产亚洲色婷婷久久99精品91| 亚洲国产一成久久精品国产成人综合| 人人妻久久人人澡人人爽人人精品| 亚洲精品无码专区久久久| 丁香色欲久久久久久综合网| 久久99国产精品成人欧美| 超级97碰碰碰碰久久久久最新| 久久发布国产伦子伦精品| 亚洲AⅤ优女AV综合久久久| 99久久99这里只有免费费精品| 久久亚洲精品无码aⅴ大香| 久久精品国产亚洲AV大全| 久久综合狠狠综合久久97色| 欧美一区二区精品久久| 99久久国产亚洲综合精品| 色综合久久88色综合天天| 色综合久久综合中文综合网| 久久精品国产第一区二区| 一本大道久久a久久精品综合| 精品久久久无码人妻中文字幕豆芽| 久久国产精品国语对白| 精品久久久久久国产潘金莲| 亚洲va久久久噜噜噜久久天堂| 久久国产精品免费一区二区三区| 色欲久久久天天天综合网| 久久天天躁狠狠躁夜夜av浪潮| 69久久精品无码一区二区| 久久精品aⅴ无码中文字字幕不卡| 性做久久久久久久久浪潮| 国産精品久久久久久久| 久久夜色精品国产亚洲| 久久无码人妻一区二区三区午夜| 国产精品美女久久福利网站| 国产精品久久新婚兰兰| 亚洲国产成人精品女人久久久| 一极黄色视频久久网站| 中文字幕久久精品|