1. 程式人生 > 實用技巧 >RabbitMQ核心概念和AMQP協議

RabbitMQ核心概念和AMQP協議

什麼是AMQP高階訊息佇列協議?

  • AMQP全稱:Advanced Message Queuing Protocol(翻譯:高階訊息佇列協議);
  • AMQP定義:
  1. 是具有現代特徵的二進位制協議;
  2. 是一個提供統一訊息服務的應用層標準高階訊息佇列協議;
  3. 是應用層協議的一個開放標準,為面向訊息的中介軟體設計;
  • AMQP的主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性、安全。
  • AMQP協議模型:
  1. 生產者應用服務端 =》將訊息扔到server端(rabbitmq的節點)上,Virtual host虛擬主機,其實就是一個上層路由邏輯的概念,Exchange也就是更上一級的AMQP協議的核心;生產者將訊息投遞到Server的Exchange交換機上。(訊息投遞要經過服務連線使用者名稱,密碼,ip地址再經過虛擬主機Virtual host,最後投遞到具體的Exchange)。
  2. 消費者應用服務端 =》監聽Message Queue(訊息佇列);Binding => Exchange 和 Message Queue(MQ)又有一個繫結關係,MQ是具體訊息的載體;

生產者將訊息投遞到交換機上,一個交換機可以繫結多個訊息佇列,交換機有一個路由策略,指定兩個屬性:
1、訊息傳送哪個exchange;
2、訊息帶上路由key,exchange和佇列Binding繫結關係,通過路由key將訊息路由到指定佇列上,傳送給消費者;

AMQP在訊息提供者和客戶端的行為進行了強制規定,使得不同賣商之間真正實現了互操作能力。
JMS是早期訊息中介軟體進行標準化的一個嘗試,它僅僅是在API級進行了規範,離建立互操作能力還差很遠。

與JMS不同,AMQP是一個Wire級的協議,它描述了在網路上傳輸的資料的格式,以位元組為流。因此任何遵守此資料格式的工具,其建立和解釋訊息,都能與其他相容工具進行互操作。

AMQP規範的版本:
0-8 是2006年6月釋出
0-9 於2006年12月釋出
0-9-1 於2008年11月釋出
0-10 於2009年下半年釋出
1.0 draft (文件還是草案)

AMQP協議實現有哪些?

1)OpenAMQ 【http://freshmeat.sourceforge.net/projects/openamq

AMQP的開源實現,用C語言編寫,運行於Linux、AIX、Solaris、Windows、OpenVMS。

2)Apache Qpid 【https://qpid.apache.org/

Apache的開源專案,支援C++、Ruby、Java、JMS、Python和.NET。

3)Redhat Enterprise MRG 【https://access.redhat.com/documentation/en-us/red_hat_enterprise_mrg/3/

實現了AMQP的最新版本0-10,提供了豐富的特徵集,比如完全管理、聯合、Active-Active叢集,有Web控制檯,還有許多企業級特徵,客戶端支援C++、Ruby、Java、JMS、Python和.NET。

4)RabbitMQ https://www.rabbitmq.com/documentation.html

一個獨立的開源實現,伺服器端用Erlang語言編寫,支援多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支援AJAX。

支援的系統和平臺/Operating Systems and Platforms

5)AMQP Infrastructure 【https://fedoraproject.org/wiki/Features/AMQP_Infrastructure

Linux下,包括Broker、管理工具、Agent和客戶端。

6)ØMQ 【https://zeromq.org/

一個高效能的訊息平臺,在分散式訊息網路可作為相容AMQP的Broker節點,綁定了多種語言,包括Python、C、C++、Lisp、Ruby等。

7)Zyre 【】

是一個Broker,實現了RestMS協議和AMQP協議,提供了RESTful HTTP訪問網路AMQP的能力。

基於AMQP協議實現了7種訊息中間間,業界選擇RabbitMQ的比較多,其中的優劣就不在贅述,我們這個系列的學習重點是RabbitMQ,在開始介紹之前,我們先來理解一下AMQP協議。

AMQP核心概念是什麼?

  • Server:又稱Broker,接受客戶端的連線,實現AMQP實體服務(接收和分發訊息的應用,RabbitMQ Server就是Message Broker);
  • Connection:publisher/consumer和broker之間的TCP連線。斷開連線的操作只會在client端進行,Broker不會斷開連線,除非出現網路故障或broker服務出現問題。
  • Channel:網路通訊,幾乎所有的操作都在Channel中進行,Channel是進行訊息讀寫的通道(訊息流轉,清空訊息,新增使用者等),客戶端可建立多個Channel,每個Channel代表一個會話任務(拿到連線,建立channel);如果每一次訪問RabbitMQ都建立一個Connection,在訊息量大的時候建立TCP Connection的開銷將是巨大的,效率也較低。Channel是在connection內部建立的邏輯連線,如果應用程式支援多執行緒,通常每個thread建立單獨的channel進行通訊,AMQP method包含了channel id幫助客戶端和message broker識別channel,所以channel之間是完全隔離的。Channel作為輕量級的Connection極大減少了作業系統建立TCP connection的開銷。
  • Message:訊息,伺服器和應用程式之間傳送的資料,由Properties和Body組成。Properties可以對訊息進行修飾,比如訊息的優先順序、延遲投遞等高階特性,Body則是訊息體內容;
  • Exchange:交換機,接收訊息,message到達broker的第一站,根據分發規則,匹配查詢表中路由鍵(routing key)轉發訊息到繫結的佇列(Queue)上;常用的型別有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
  • Binding:繫結,Exchange和Queue之間的虛擬連線,binding中可以包含routing key,Binding資訊被儲存到exchange中的查詢表中,用於message的分發依據;
  • Routing key:一個路由規則,虛擬機器可用它來確定如何路由一個特定訊息;
  • Queue:也稱為Message Queue(訊息佇列),訊息最終被送到這裡等待consumer(消費者)取走。一個message可以被同時拷貝到多個queue中;

【參考文章】