AMQP全稱是Advanced MessageQueuing Protocol (高級消息隊列協議)。算法
AMQP是一個應用層的異步消息傳遞協議,爲面向消息的中間件而設計。其目的是經過協議使應用模塊之間或應用程序與中間件等進行充分解耦。而在設計初期,AMQP的原始用途只是爲金融界提供一個能夠彼此協做的消息協議。如今已經有至關一部分遵循AMQP的服務器和客戶端供使用。其中RabbitMQ是AMQP的一款開源標準實現。緩存
06年初AMQP協議發佈,06年末RabbitMQ1.0版本發佈安全
AMQP 有四個很是重要的概念:虛擬機(virtual host),交換器(exchange),隊列(queue)和綁定(binding)。服務器
虛擬機(virtual host): 一般是應用的外在邊界,咱們能夠爲不一樣的虛擬機分配訪問權限。虛擬機可持有多個交換器、隊列和綁定。架構
vhost做用:異步
a.邏輯分離容許爲不一樣應用程序安全保密的運行數據,將rabbit的衆多客戶區分開來,避免隊列和交換器的命名衝突;ui
b.權限控制以vhost爲單位;spa
c.vhost之間是絕對隔離的,沒法將vhost1上的交換器綁定到vhost2中的隊列去;設計
d.能夠安全的遷移到新的RabbitMQ服務器上處理新的負載,不會有任何命名衝突中間件
e.vhost不只消除了在基礎架構中爲每一層都運行一個RabbitMQ服務器,也避免了爲每一層建立不一樣集羣
交換器(exchange): 從鏈接通道(Channel)接收消息,並按照特定的路由規則發送給隊列。
隊列(queue): 消息最終的存儲容器,直到消費客戶端(Consumer)將其取走。
綁定(binding): 也就是所謂的路由規則,告訴交換器將何種類型的消息發送到某個隊列中。
AMQP協議是一個二進制協議,擁有一些現代特色:多信道、協商式、異步、安全、跨平臺、中立、高效。
AMQP協議分爲三層:
ModelLayer:模型層規範服務器和Broker行爲,定義了一套命令(按功能分類),客戶端應用能夠利用這些命令來實現它的業務功能。
Session Layer:會話層定義客戶端與服務器端Broker的上下文,負責將命令從客戶端應用傳遞給服務器,再將服務器的應答傳遞給客戶端應用,會話層爲這個傳遞過程提供可靠性、同步機制和錯誤處理
Transport Layer:傳輸二進制數據流,傳輸層提供幀處理、信道複用、錯誤檢測和數據表示。
支持全部消息中間件的功能:消息交換、文件傳輸、流傳輸、遠程進程調用等。
AMQP的服務器(Broker)主要由交換器、消息、隊列組成。Broker的主要功能是消息的路由和緩存。對於須要保障可靠性的消息,RabbitMQ能夠將消息、隊列和交換器的數據寫入本地硬盤。而對於響應時間敏感的消息,RabbitMQ能夠不配置持久化機制。
交換器(Exchange)接受來自生產者的消息,並根據不一樣路由算法將消息發送到消息隊列。
消息隊列(Message Queue)在消息沒有被消費者消費時將其緩存,當消費者與消息隊列鏈接時,消息隊列會把消息轉發給消費者。不過也能夠將一個隊列配置爲這樣:一旦消息進入這個隊列,此消息就會被刪除。
消息(Message)是AMQP通訊的基本因素。消息由Header和Body組成。與TCP/IP協議相似,Header包含的是各類屬性信息,Body是真正傳輸的數據。
交換器與消息隊列的關聯經過Binding實現。交換器與多個消息隊列Binding後會造成一張「路由表」,其中存儲的信息包括消息隊列的限制條件即Binding Key。交換器收到消息時會解析其Header中的Routing Key,根據交換類型(Exchange Type)將消息路由到消息隊列。
1)信息的發送者和接收者如何維持這個鏈接,若是一方的鏈接中斷,這期間的數據如何防止丟失?
2)如何下降發送者和接收者的耦合度?
3)如何讓Priority高的接收者先接到數據?
4)如何作到load balance?有效均衡接收者的負載?
5)如何有效的將數據發送到相關的接收者?也就是說將接收者subscribe 不一樣的數據,如何作有效的filter。
6)如何作到可擴展,甚至將這個通訊模塊發到cluster上?
7)如何保證接收者接收到了完整,正確的數據?
AMQP協議解決了以上的問題,而RabbitMQ實現了AMQP。