1. 什麼是AMQP?
在異步通信中,消息不會馬上到達接收方,而是被存放到一個容器中,當知足必定的條件以後,消息會被容器發送給接收方,這個容器即消息隊列,而完成這個功能須要雙方和容器以及其中的各個組件遵照統一的約定和規則,AMQP就是這樣的一種協議,消息發送與接受的雙方遵照這個協議能夠實現異步通信。這個協議約定了消息的格式和工做方式。
2. 爲何使用AMQP
爲何使用AMQP或者AMQP解決了什麼問題?
在分佈式的系統中,子系統之若是使用socket鏈接進行通信,有不少問題須要解決。好比:
1)信息的發送者和接受者如何維持這個鏈接,若是一方中斷,這期間的數據如何防止丟失?
2)如何下降發送者和接受者的耦合度?
3)如何讓優先級高的接受者先接到數據?
4)如何作到load balance?均衡接受者的負載?
5)如何將信息發送到相關的接收者,若是接受者訂閱了不一樣的數據,如何正確的分發到接受者?
6)如何作到可擴展,將通訊模塊發到集羣上去。
7)如何保證接受者接到了完整,正確或是有序的數據?
AMQP解決了這些問題。與此同時,基於AMQP實現的產品相比其餘相似產品(AcitveMQ,Openfire)有着本身的特色。
產品 | 優勢 | 缺點 |
---|---|---|
OpenFire(XMPP) | 1.成熟穩定2.適合作IM服務器 | 1.消息可靠性無保障2.路由策略不靈活3.集羣模式不完善4.協議過重 |
ActiveMQ(JMS) | 1.成熟穩定2.與Java契合度高 | 1.路由策略不靈活2.集羣模式不穩定 |
RabbitMQ(AMQP) | 1.成熟穩定2.路由策略靈活3.消息傳輸可靠4.集羣方案成熟 | 1.配置多,學習和運維成本高 |
由上圖比較能夠看出,基於AMQP的RabbitMQ具備路由靈活,消息可靠等特色,當有路由策略多樣化,和消息可靠傳輸的需求時可考慮使用基於AMQP的產品。java
3. AMQP 的模型和原理
3.1 AMQP 中包含的主要元素
生產者(Producer):向Exchange發佈消息的應用。 消費者(Consumer):從消息隊列中消費消息的應用。 消息隊列(Message Queue):服務器組件,用於保存消息,直到發送給消費者。消息(Message):傳輸的內容。 交換器(exchange):路由組件,接收Producer發送的消息,並將消息路由轉發給消息隊列。 虛擬主機(Virtual Host): 一批交換器,消息隊列和相關對象。虛擬主機是共享相同身份認證和加密環境的獨立服務器域。 Broker :AMQP的服務端稱爲Broker。 鏈接(Connection):一個網絡鏈接,好比TCP/IP套接字鏈接。 信道(Channel):多路複用鏈接中的一條獨立的雙向數據流通道,爲會話提供物理傳輸介質。 綁定器(Binding):消息隊列和交換器直接的關聯。服務器
3.2 AMQP 的組件結構圖
3.3 AMQP 如何實現通訊的
(1)創建鏈接Connection。由producer和consumer建立鏈接,鏈接到broker的物理節點上。 (2)創建消息Channel。Channel是創建在Connection之上的,一個Connection能夠創建多個Channel。producer鏈接Virtual Host 創建Channel,Consumer鏈接到相應的queue上創建Channel。 (3)發送消息。由Producer發送消息到Broker中的exchange中。 (4)路由轉發。exchange收到消息後,根據必定的路由策略,將消息轉發到相應的queue中去。 (5)消息接收。Consumer會監聽相應的queue,一旦queue中有能夠消費的消息,queue就將消息發送給Consumer端。 (6)消息確認。當Consumer完成某一條消息的處理以後,須要發送一條ACK消息給對應的Queue。Queue收到ACK信息後,纔會認爲消息處理成功,並將消息從Queue中移除;若是在對應的Channel斷開後,Queue沒有收到這條消息的ACK信息,該消息將被髮送給另外的Channel。至此一個消息的發送接收流程走完了。消息的確認機制提升了通訊的可靠性。網絡
3.4 exchange 與 Queue 的路由機制
exchange 將消息發送到哪個queue是由exchange type 和bing 規則決定的,目前經常使用的有3種exchange,Direct exchange, Fanout exchange, Topic exchange 。 Direct exchange 直接轉發路由,其實現原理是經過消息中的routkey,與queue 中的routkey 進行比對,若兩者匹配,則將消息發送到這個消息隊列。 Fanout exchange 複製分發路由,該路由不須要routkey,當exchange收到消息後,將消息複製多份轉發給與本身綁定的消息隊列。 topic exchange 通配路由,是direct exchange的通配符模式,消息中的routkey能夠寫成通配的模式,exchange支持「#」和「*」 的通配。收到消息後,將消息轉發給全部符合匹配表達式的queue。 須要注意的一點只有queue具備保持消息的功能,exchange不能保存消息。運維
4. AQMP 的應用場景
AQMP是實現消息機制的一種協議,消息隊列主要有如下幾種應用場景:
4.1 異步處理
4.2 應用解耦
4.3 流量緩衝
4.4 日誌處理
5. AMQP 與 RabbitMQ
AMQP 是一種協議, RabbitMQ是一個由erlang開發的AMQP的開源實現,目前使用比較普遍的MQ有RabbitMQ,ActiveMQ,KafKa等等,其中ActiveMQ是基於JMS的一個開源實現,JMS 是一個接口標準或者說是一個API消息服務的規範(JAVA Message Service,java消息服務),KafKa是一種高吞吐量的分佈式發佈訂閱消息系統,一般有吞吐量需求的日誌處理和日誌聚合應用會使用Kafka,性能要優於Rabbit,可是穩定性和可靠性相對而言RabbitMQ要成熟一些。異步