rabbitMQ說明文檔

rabbitMQ是什麼  html

RabbitMQ     是由     LShift     提供的一個     Advanced Message Queuing Protocol (AMQP)     的開源實現,由以高性能、健壯以及可伸縮性出名的     Erlang     寫成(所以也是繼承了這些優勢)。   python

首先介紹     AMQP     和一些基本概念:   數據庫

      當前各類應用大量使用異步消息模型,並隨之產生衆多消息中間件產品及協議,標準的不一導致應用與中間件之間的耦合限制產品的選擇,並增長維護成本。     AMQP     是一個提供統一消息服務的應用層標準協議,基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端     /     中間件不一樣產品,不一樣開發語言等條件的限制。     固然這種下降耦合的機制是基於與上層產品,語言無關的協議。     AMQP     協議是一種二進制協議,提供客戶端應用與消息中間件之間異步、安全、高效地交互。從總體來看,     AMQP     協議可劃分爲三層。   vim

這種分層架構相似於     OSI     網絡協議,可替換各層實現而不影響與其它層的交互。     AMQP     定義了合適的服務器端域模型,用於規範服務器的行爲     (AMQP     服務器端可稱爲     broker)     。   安全

Model     層決定這些基本域模型所產生的行爲,這種行爲在     AMQP     中用     」command」     表示,在後文中會着重來分析這些域模型。   服務器

Session     層定義客戶端與     broker     之間的通訊     (     通訊雙方都是一個     peer     ,可互稱作     partner)     ,爲     command     的可靠傳輸提供保障。   網絡

Transport     層專一於數據傳送,並與     Session     保持交互,接受上層的數據,組裝成二進制流,傳送到     receiver     後再解析數據,交付給     Session     層。     Session     層須要     Transport     層完成網絡異常狀況的彙報,順序傳送     command     等工做。   架構

AMQP     當中有四個概念很是重要:虛擬主機(     virtual host     ),交換機(     exchange     ),隊列(     queue     )和綁定(     binding     )。   併發

虛擬主機(     virtual host     ):一個虛擬主機持有一組交換機、隊列和綁定。爲何須要多個虛擬主機呢?     RabbitMQ     當中,用戶只能在虛擬主機的粒度進行權限控制。所以,若是須要禁止     A     組訪問     B     組的交換機     /     隊列     /     綁定,必須爲     A     和     B     分別建立一個虛擬主機。每個     RabbitMQ     服務器都有一個默認的虛擬主機     「/」     。   異步

隊列(     Queue     ):由消費者創建的,是     messages     的終點,能夠理解成裝消息的容器。消息一直存在隊列裏,直到有客戶端或者稱爲     Consumer     消費者鏈接到這個隊列並將     message     取走爲止。隊列能夠有多個。  

交換機(     Exchange     ):能夠理解成具備路由表的路由程序。每一個消息都有一個路由鍵(     routing key     ),就是一個簡單的字符串。交換機中有一系列的綁定(     binding     ),即路由規則(     routes     )。交換機能夠有多個。多個隊列能夠和同一個交換機綁定,同時多個交換機也能夠和同一個隊列綁定。(多對多的關係)  

三種交換機:  

1.           Fanout Exchange     (不處理路由鍵):一個發送到交換機上的消息都會被轉發到與該交換機綁定的全部隊列上。     Fanout     交換機發消息是最快的。  

2.           Direct Exchange     (處理路由鍵):若是一個隊列綁定到該交換機上,而且當前要求路由鍵爲     X     ,只有路由鍵是     X     的消息纔會被這個隊列轉發。  

3.           Topic Exchange     (將路由鍵和某模式進行匹配,能夠理解成模糊處理):路由鍵的詞由     「.」     隔開,符號     「#」     表示匹配     0     個或多個詞,符號     「*」     表示匹配很少很多一個詞。所以     「           audit.#          」     可以匹配到     「           audit.irs.corporate          」     ,可是     「           audit.*          」     只會匹配到     「           audit.irs          」  

具體例子能夠看下圖  

持久化:隊列和交換機有一個建立時候指定的標誌durable,直譯叫作堅固的。durable的惟一含義就是具備這個標誌的隊列和交換機會在重啓以後從新創建,它不表示說在隊列當中的消息會在重啓後恢復。那麼如何才能作到不僅是隊列和交換機,還有消息都是持久的呢?  

可是首先一個問題是,你真的須要消息是持久的嗎?對於一個須要在重啓以後回覆的消息來講,它須要被寫入到磁盤上,而即便是最簡單的磁盤操做也是要消耗時間的。若是和消息的內容相比,你更看重的是消息處理的速度,那麼不要使用持久化的消息。  

當你將消息發佈到交換機的時候,能夠指定一個標誌「Delivery Mode」(投遞模式)。根據你使用的AMQP的庫不一樣,指定這個標誌的方法可能不太同樣。簡單的說,就是將 Delivery Mode設置成2,也就是持久的便可。通常的AMQP庫都是將Delivery Mode設置成1,也就是非持久的。因此要持久化消息的步驟以下:  

1.           將交換機設成     durable     。  

2.           將隊列設成     durable     。  

3.           將消息的     Delivery Mode     設置成     2     。  

綁定(     Bindings     )如何持久化?咱們沒法在建立綁定的時候設置成     durable     。沒問題,若是綁定了一個     durable     的隊列和一個     durable     的交換機,     RabbitMQ     會自動保留這個綁定。相似的,若是刪除了某個隊列或交換機(不管是否是     durable     ),依賴它的綁定都會自動刪除。  

注意兩點:  

1.           RabbitMQ     不容許綁定一個非堅固(     non-durable     )的交換機和一個     durable     的隊列。反之亦然。要想成功必須隊列和交換機都是     durable     的。  

2.           一旦建立了隊列和交換機,就不能修改其標誌了。例如,若是建立了一個     non-durable     的隊列,而後想把它改變成     durable     的,惟一的辦法就是刪除這個隊列而後重現建立。所以,最好仔細檢查建立的標誌。  

消息隊列(MQ)使用過程  

幾個概念說明:  

1.  Broker:簡單來講就是消息隊列服務器實體。  

2.  Exchange:消息交換機,它指定消息按什麼規則,路由到哪一個隊列。  

3.  Queue:消息隊列載體,每一個消息都會被投入到一個或多個隊列。  

4.  Binding:綁定,它的做用就是把exchange和queue按照路由規則綁定起來。  

5.  Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。  

6.  vhost:虛擬主機,一個broker裏能夠開設多個vhost,用做不一樣用戶的權限分離。  

7.  producer:消息生產者,就是投遞消息的程序。  

8.  consumer:消息消費者,就是接受消息的程序。  

9.  channel:消息通道,在客戶端的每一個鏈接裏,可創建多個channel,每一個channel表明一個會話任務。  

消息隊列的使用過程大概以下:  

1.  客戶端鏈接到消息隊列服務器,打開一個channel。  

2.  客戶端聲明一個exchange,並設置相關屬性。  

3.  客戶端聲明一個queue,並設置相關屬性。  

4.  客戶端使用routing key,在exchange和queue之間創建好綁定關係。  

5.  客戶端投遞消息到exchange。  

6.  exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列裏。  

rabbitMQ的優勢(適用範圍)  

1.        基於erlang語言開發具備高可用高併發的優勢,適合集羣服務器。  

2.        健壯、穩定、易用、跨平臺、支持多種語言、文檔齊全。  

3.        有消息確認機制和持久化機制,可靠性高。  

4.        開源  

其餘MQ的優點:  

1.        Apache ActiveMQ曝光率最高,可是可能會丟消息。  

2.        ZeroMQ延遲很低、支持靈活拓撲,可是不支持消息持久化和崩潰恢復。  

rabbitMQ單個節點部署文檔  

Ubuntu(12.04)安裝rabbitMQ(python使用rabbitMQ服務)  

1.   添加rabbitmq源:  

1)   sudo vim /etc/apt/sources.list  

2)   把 deb     http://www.rabbitmq.com/debian/          testing main 添加進去  

2.   添加公鑰:  

1)   wget     http://www.rabbitmq.com/rabbitmq-signing-key-public.asc       

2)   sudo apt-key add rabbitmq-signing-key-public.asc  

3.   更新並安裝rabbitmq-server:  

1)   wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.2.2/rabbitmq-server_3.2.2-1_all.deb  

2)   sudo dpkg -i rabbitmq-server_3.2.2-1_all.deb  

4.   安裝pika:  

1)   sudo apt-get install python-pip  

2)   sudo pip install pika  

5.   配置文件:官方地址:http://www.rabbitmq.com/configure.html通常狀況下,RabbitMQ的默認配置就足夠了。若是但願特殊設置的話,有兩個途徑:一個是環境變量的配置文件rabbitmq-env.conf;一個是配置信息的配置文件 rabbitmq.config;注意,這兩個文件默認是沒有的,若是須要必須本身建立。  

1)   rabbitmq-env.conf:這個文件的位置是肯定和不能改變的,位於:/etc/rabbitmq目錄下(這個目錄須要本身建立)。文件的內容     包括了     RabbitMQ的一些環境變量,經常使用的有:端口號、配置文件的路徑、須要使用的MNESIA數據庫的路徑、log的路徑插件的路徑。  

具體的列表見:     http://www.rabbitmq.com/configure.html#define-environment-variables       

2)   rabbitmq.config:這是一個標準的erlang配置文件。它必須符合erlang配置文件的標準。它既有默認的目錄,也能夠在rabbitmq-env.conf文件中配置。文件的內容詳見:     http://www.rabbitmq.com/configure.html#config-items(       更改完密碼配置除了重啓必定要再用命令行改一下       )    

相關文章
相關標籤/搜索