2、AMQ協議的簡單理解

1.消費者和生產者

    生產者(producer)建立消息,而後發佈到代理服務器(RabbitMQ)。消息包含兩部份內容:有效載荷(payload)和標籤(label)。有效載荷就是想要傳輸的數據。標籤用於描述有效載荷,而且RabbitMQ用它來決定誰將得到消息的拷貝。舉例來講,不一樣於TCP協議的是,當你明確指定發送方和接收方,AMQP只會用標籤表示這條消息(一個交換器的名稱和可選的主題標記),而後把消息交由RabbitMQ,RabbitMQ會根據標籤把消息發送給感興趣的接收方。這種通信方式是一種「發後忘卻」(fire-and-forget)的單向方式。安全

    消費者鏈接到代理服務器,並訂閱到隊列(queue)上。能夠把消息隊列想象撐一個具名郵箱。每當消息到達特定的郵箱時,RabbitMQ會將其發送給起重一個訂閱的/監聽的消費者。當消費者接收到消息時,它只會得到有效載荷。在消息路由過程當中,消息的標籤並無隨有效載荷一同傳遞。RabbitMQ甚至不會告訴你是誰產生/發送了消息。就比如收到快遞時,寄件人是空白的。服務器

發送與接收的整個過程其實很簡單:生產者建立信息,消費者接收信息。不過再次以前,必須建立一條信道(channel)。性能

2.信道

    在應用程序和Rabbit代理服務器之間建立一條TCP鏈接。一旦TCP鏈接打開(經過了認證),應用程序就能夠建立一條AMQP信道。信道是創建在「真實的」TCP鏈接內的虛擬鏈接。AMQP命令都是經過信道發送出去的。每條信道都會被指派一個惟一ID。不管是發佈消息、訂閱隊列或是接收消息,這些動做都是經過信道完成的。spa

    爲何不直接經過TCP鏈接發送AMQP命令呢?主要緣由在於對操做系統來講,創建和銷燬TCP會話是很是昂貴的開銷。假設在高峯期,會有成百上千的鏈接,這樣會形成TCP鏈接的巨大浪費,操做系統每秒也就只能創建這點數量的鏈接。所以,可能很快就碰到性能瓶頸了。在一條TCP鏈接上,建立多少條信道是沒有限制的。操作系統

3.AMQP消息路由的組成

    AMQP消息路由必須有三個部分:交換器、隊列和綁定。代理

    隊列就如同具名郵箱,消息最終達到隊列中並等待消費。消費者經過consume或者get來從特定的隊列中接收消息:隊列

    consume用來訂閱命令。這樣作會將信道設置爲接收模式,直到取消對隊列的訂閱爲止。路由

    get用來向隊列請求單條的消息,大體上講get命令會訂閱消息,得到單條消息,而後取消訂閱。get

    當隊列擁有多個消費者時,隊列收到的消息將以循環(round-robin)的方式發送給消費者。消費者必須經過ack命令顯示地向RabbitMQ發送一個確認,或者在訂閱到隊列時就將auto_ack設置爲true,當設置了auto_ack,一旦消費者接收消息,就會被視爲確認了消息。消息隊列

    注意,消費者接收到了消息,不等於生產者已經知道消息已經被接收了,這兩件事毫無關聯。所以,消費者經過asc命令告訴RabbitMQ,它已經正確地接收了消息,這樣,RabbitMQ才能安全地把消息從隊列中刪除。

    若是消費者收到一條消息,而後在確認以前與RabbitMQ斷開了鏈接,或者從隊列上取消訂閱,RabbitMQ會認爲這條消息沒有分發,而後從新分發給下一個訂閱的消費者。另外一方面,若是應用程序有bug而忘記確認消息的話,RabbitMQ將不會繼續給該消費者發送消息了。

    若是你正使用RabbitMQ2.00或者更新的版本,那就可使用reject命令,設置成true的話,RabbitMQ會將消息從新發送給下一個訂閱的消費者。若是設置成false的話,RabbitMQ會把消息從隊列中移除,而不會把它發送給新的消費者。移除的消息會進入一個特殊的「死信」(dead letter)隊列,它用來存放那些被拒絕而不從新入隊列的消息。

4.交換器與綁定

    當你想把消息投到隊列時,須要把消息發送給交換器來完成。而後,根據肯定的規則,RabbitMQ會決定消息該投遞給哪一個隊列。這些規則被稱爲路由鍵(routing key)。隊列經過路由鍵綁定到交換器。當你把消息發送到代理服務器時,消息將擁有一個路由鍵,即便是空的。RabbitMQ也會將其和綁定使用的路由鍵進行匹配。

    一共有四種類型是交換器:direct、fanout、topic和headers。其中headers容許匹配AMQP消息的header而非路由,其他的和direct徹底一致。

    direct很是簡單,若是路由鍵匹配的話,消息就被投遞到對應的隊列。

    fanout會將收到的消息廣播到綁定的隊列上。

    topic容許來自不一樣源頭的消息達到同一個隊列。例如,可使用log.*這種表達式發送隊列。

    以上三種交換器與綁定方式,將在後面使用代碼進行實現。

5.虛擬主機與隔離

    每個RabbitMQ服務器都能建立虛擬消息服務器(vhost),每個vhost本質上是一個mini的RabbitMQ服務器,擁有本身的隊列、交換器和綁定,還有本身的權限機制。

    因爲RabbitMQ包含了開箱即用的默認vhost:"/",所以使用起來很是簡單。vhost之間是絕對隔離的。

相關文章
相關標籤/搜索