1. 程式人生 > >AMQP協議介紹

AMQP協議介紹

可用 windows 中介 -m 通道 過程 我們 htm outer

AMQP協議介紹

AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。

AMQP的主要特征是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。

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
AMQP的開源實現,用C語言編寫,運行於Linux、AIX、Solaris、Windows、OpenVMS。

2)Apache Qpid
Apache的開源項目,支持C++、Ruby、Java、JMS、Python和.NET。

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

4)RabbitMQ
一個獨立的開源實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。RabbitMQ發布在Ubuntu、FreeBSD平臺。

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

6)?MQ
一個高性能的消息平臺,在分布式消息網絡可作為兼容AMQP的Broker節點,綁定了多種語言,包括Python、C、C++、Lisp、Ruby等。

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

JMS協議介紹

JMS(Java Messaging Service)是Java平臺上有關面向消息中間件的技術規範,它便於消息系統中的Java應用程序進行消息交換,並且通過提供標準的產生、發送、接收消息的接口簡化企業應用的開發。

JMS本身只定義了一系列的接口規範,是一種與廠商無關的 API,用來訪問消息收發系統。它類似於 JDBC(Java Database Connectivity):這裏,JDBC 是可以用來訪問許多不同關系數據庫的 API,而 JMS 則提供同樣與廠商無關的訪問方法,以訪問消息收發服務。許多廠商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,這只是幾個例子。 JMS 使您能夠通過消息收發服務(有時稱為消息中介程序或路由器)從一個 JMS 客戶機向另一個 JML 客戶機發送消息。消息是 JMS 中的一種類型對象,由兩部分組成:報頭和消息主體。報頭由路由信息以及有關該消息的元數據組成。消息主體則攜帶著應用程序的數據或有效負載。根據有效負載 的類型來劃分,可以將消息分為幾種類型,它們分別攜帶:簡單文本 (TextMessage)、可序列化的對象 (ObjectMessage)、屬性集合 (MapMessage)、字節流 (BytesMessage)、原始值流 (StreamMessage),還有無有效負載的消息 (Message)。

STOMP協議介紹

STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息協議,是一種為MOM(Message Oriented Middleware,面向消息的中間件)設計的簡單文本協議。

它提供了一個可互操作的連接格式,允許STOMP客戶端與任意STOMP消息代理(Broker)進行交互,類似於OpenWire(一種二進制協議)。

由於其設計簡單,很容易開發客戶端,因此在多種語言和多種平臺上得到廣泛應用。其中最流行的STOMP消息代理是Apache ActiveMQ。

STOMP協議工作於TCP協議之上,使用了下列命令:

* SEND 發送
* SUBSCRIBE 訂閱
* UNSUBSCRIBE 退訂
* BEGIN 開始
* COMMIT 提交
* ABORT 取消
* ACK 確認
* DISCONNECT 斷開

消息中間件概況

消息隊列技術是分布式應用間交換信息的一種技術。消息隊列可駐留在內存或磁盤上,隊列存儲消息直到它們被應用程序讀走。通過消息隊列,應用程序可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程序接收此消息。

在分布式計算環境中,為了集成分布式應用,開發者需要對異構網絡環境下的分布式應用提供有效的通信手段。為了管理需要共享的信息,對應用提供公共的信息交換機制是重要的。

設計分布式應用的方法主要有:遠程過程調用(PRC)-分布式計算環境(DCE)的基礎標準成分之一;對象事務監控(OTM)-基於CORBA的面向對象工業標準與事務處理(TP)監控技術的組合;消息隊列(MessageQueue)-構造分布式應用的松耦合方法。

(a) 分布計算環境/遠程過程調用 (DCE/RPC)

RPC是DCE的成分,是一個由開放軟件基金會(OSF)發布的應用集成的軟件標準。RPC模仿一個程序用函數引用來引用另一程序的傳統程序設計方法,此引用是過程調用的形式,一旦被調用,程序的控制則轉向被調用程序。

在RPC 實現時,被調用過程可在本地或遠地的另一系統中駐留並在執行。當被調用程序完成處理輸入數據,結果放在過程調用的返回變量中返回到調用程序。RPC完成後程序控制則立即返回到調用程序。因此RPC模仿子程序的調用/返回結構,它僅提供了Client(調用程序)和Server(被調用過程)間的同步數據交換。

(b) 對象事務監控 (OTM)

基於CORBA的面向對象工業標準與事務處理(TP)監控技術的組合,在CORBA規範中定義了:使用面向對象技術和方法的體系結構;公共的 Client/Server程序設計接口;多平臺間傳輸和翻譯數據的指導方針;開發分布式應用接口的語言(IDL)等,並為構造分布的 Client/Server應用提供了廣泛及一致的模式。

(c) 消息隊列 (Message Queue)

消息隊列為構造以同步或異步方式實現的分布式應用提供了松耦合方法。消息隊列的API調用被嵌入到新的或現存的應用中,通過消息發送到內存或基於磁盤的隊列或從它讀出而提供信息交換。消息隊列可用在應用中以執行多種功能,比如要求服務、交換信息或異步處理等。

中間件是一種獨立的系統軟件或服務程序,分布式應用系統借助這種軟件在不同的技術之間共享資源,管理計算資源和網絡通訊。它在計算機系統中是一個關鍵軟件,它能實現應用的互連和互操作性,能保證系統的安全、可靠、高效的運行。中間件位於用戶應用和操作系統及網絡軟件之間,它為應用提供了公用的通信手段,並且獨立於網絡和操作系統。中間件為開發者提供了公用於所有環境的應用程序接口,當應用程序中嵌入其函數調用,它便可利用其運行的特定操作系統和網絡環境的功能,為應用執行通信功能。

如果沒有消息中間件完成信息交換,應用開發者為了傳輸數據,必須要學會如何用網絡和操作系統軟件的功能,編寫相應的應用程序來發送和接收信息,且交換信息沒有標準方法,每個應用必須進行特定的編程從而和多平臺、不同環境下的一個或多個應用通信。例如,為了實現網絡上不同主機系統間的通信,將要求具備在網絡上如何交換信息的知識(比如用TCP/IP的socket程序設計);為了實現同一主機內不同進程之間的通訊,將要求具備操作系統的消息隊列或命名管道(Pipes)等知識。

目前中間件的種類很多,如交易管理中間件、面向Java應用的Web應用服務器中間件等,而消息傳輸中間件(MOM)是其中的一種。它簡化了應用之間數據的傳輸,屏蔽底層異構操作系統和網絡平臺,提供一致的通訊標準和應用開發,確保分布式計算網絡環境下可靠的、跨平臺的信息傳輸和數據交換。它基於消息隊列的存儲-轉發機制,並提供特有的異步傳輸機制,能夠基於消息傳輸和異步事務處理實現應用整合與數據交換。

發布-訂閱消息模式

一、 訂閱雜誌

我們很多人都訂過雜誌,其過程很簡單。只要告訴郵局我們所要訂的雜誌名、投遞的地址,付了錢就OK。出版社定期會將出版的雜誌交給郵局,郵局會根據訂閱的列表,將雜誌送達消費者手中。這樣我們就可以看到每一期精彩的雜誌了。

技術分享圖片

仔細思考一下訂雜誌的過程,我們會發現這樣幾個特點:1、 消費者訂雜誌不需要直接找出版社;2、 出版社只需要把雜誌交給郵局;3、 郵局將雜誌送達消費者。郵局在整個過程中扮演了非常重要的中轉作用,在出版社和消費者相互不需要知道對方的情況下,郵局完成了雜誌的投遞。
二、 發布-訂閱消息模式

剛剛講了訂閱雜誌,下面我們會講傳統調用模式演化到發布-訂閱消息模式。
有些網站在註冊用戶成功後發一封激活郵件,用戶收到郵件後點擊激活鏈接後才能使用該網站。一般的做法是在註冊用戶業務邏輯中調用發送郵件的邏輯。這 樣用戶業務就依賴於郵件業務。如果以後改為短信激活,註冊用戶業務邏輯就必須修改為調用發送短信的邏輯。如果要註冊後給用戶加點積分,再加一段邏輯。經過 多次修改,我們發現很簡單的註冊用戶業務已經越來越復雜,越來越難以維護。相信很多開發者都會有類似痛苦的經歷。

技術分享圖片

即使用戶業務實現中對其他業務是接口依賴,也避免不了業務變化帶來的依賴影響。怎麽辦?解耦!將註冊用戶業務邏輯中註冊成功後的處理剝離出來。
再回頭看看"訂閱雜誌",如果沒有郵局,出版社就必須自己將雜誌送達所有消費者。這種情形就和現在的註冊用戶業務一樣。我們發現問題了,在用戶業務和其他業務之間缺少了郵局所扮角色。
我們把郵局抽象成一個管理消息的地方,叫"消息管理器"。註冊用戶成功後發送一個消息給消息管理器,由消息管理器轉發該消息給需要處理的業務。現在,用戶業務只依賴於消息管理器了,它再也不會為了註冊用戶成功後的其他處理而煩惱。

技術分享圖片

註冊用戶的改造就是借鑒了"訂閱雜誌"這樣原始的模式。我們再進一步抽象,用戶業務就是消息的"生產者",它將消息發布到消息管理器。郵件業務就是 消息的"消費者",它將收到的消息進行處理。郵局可以訂閱很多種雜誌,雜誌都是通過某種編號來區分;消息管理器也可以管理多種消息,每種消息都會有一個 "主題"來區分,消費者都是通過主題來訂閱的。
技術分享圖片

發布-訂閱消息模式已經呈現在我們面前,利用它可以產生更靈活、更松散耦合的系統。

MQ相關概念

1.消息(Message)

消息是MQ中最小的概念,本質上就是一段數據,它能被一個或者多個應用程序所理解,是應用程序之間傳遞的信息載體。

2.隊列(Queue)

2.1本地隊列

本地隊列按照功能可劃分為初始化隊列,傳輸隊列,目標隊列和死信隊列。

初始化隊列用作消息觸發功能。

傳輸隊列只是暫存待傳的消息,條件許可的情況下,通過管道將消息傳送到其他的隊列管理器。

目標隊列是消息的目的地,可以長期存放消息。

如果消息不能送達目標隊列,也不能再路由出去,則被自動放入死信隊列保存。

2.2別名隊列&遠程隊列

只是一個隊列定義,用來指定遠端隊列管理器的隊列。使用了遠程隊列,程序就不需要知道目標隊列的位置。

2.3模型隊列

模型隊列定義了一套本地隊列的屬性結合,一旦打開模型隊列,隊列管理器會按照這些屬性動態地創建出一個本地隊列。

3.隊列管理器(Queue Manager)

隊列管理器是一個負責向應用程序提供消息服務的機構,如果把隊列管理器比作數據庫,那麽隊列就是其中一張表。

4.通道(Channel)

通道是兩個管理器之間的一種單向點對點的的通信連接,如果需要雙向交流,可以建立一對通道。

5.監聽器(listner)

mdss_dsi_phy_init(&mipi_pinfo,MIPI_DSI1_BASE, DSI1_PHY_BASE);

7.2 ret = mdss_dsi_host_init(mipi, mipi->dual_dsi, mipi->broadcast);
初始化DSI接口的host控制器。

7.3 調用if (panel->pre_init_func) {}函數:
static int mdss_dsi_panel_pre_init(void)
{
intret = NO_ERROR;

   if(panelstruct.paneldata->panel_lp11_init) {
          ret= mdss_dsi_panel_reset(1);
          if(ret) {
                 dprintf(CRITICAL,"panel reset failed\n");
                 returnret;
          }
   }

   if(panelstruct.paneldata->panel_init_delay)
          udelay(panelstruct.paneldata->panel_init_delay);

   dprintf(SPEW,"Panel pre init done\n");
   returnret;

}
因為panelstruct.paneldata->panel_lp11_initinit_panel_data()函數賦值為1,所以調用mdss_dsi_panel_reset()根據reset時序來復位panel。

8. ret = msm_display_on();

主要部分:

case MIPI_VIDEO_PANEL:
        dprintf(INFO, www.dongfan178.com/ "Turn on MIPI_VIDEO_PANEL.\n");
        ret = mdp_dsi_video_on(pinfo);
        if (ret)
            goto www.fencaiyule.cn/ msm_display_on_out;

        ret = mdss_dsi_post_on(panel);
        if (ret)
            goto msm_display_on_out;

        ret = mipi_dsi_on(pinfo);
        if (ret)
            goto msm_display_on_out;
        break;

8.1 調用mdp_dsi_video_on(www.leyou2.net)使能DSI VIDEO
8.2 mdss_dsi_post_on()使用初始化命令來初始化panel
8.3 mipi_dsi_on()

9. 打開背光:

/* Turn on backlight */
if (pdata->bl_func)
    ret = pdata->bl_func(1);

MQ產品的特性

可靠性傳輸

這個特點可以說是消息中間件的立足之本,對於應用來說,只要成功把數據提交給消息中間件,那麽關於數據可靠傳輸的問題就由消息中間件來負責。

不重復傳輸

不重復傳播也就是斷點續傳的功能,特別適合網絡不穩定的環境,節約網絡資源。

異步性傳輸

異步性傳輸是指,接受信息雙方不必同時在線,具有脫機能力和安全性。

消息驅動

接到消息後主動通知消息接收方。

支持事務

應用程序可以把一些數據更新組合成一個工作單元,這些更新通常是邏輯相關的,為了保障數據完整性,所有的更新必須同時成功或者同時失敗)。

技術分享圖片

MQ適用場景介紹

MQ消息隊列是應運松偶合的概念而產生的,主要以隊列和發布訂閱為消息傳輸機制,以異步的方式將消息可靠的傳輸到消費端的一種基礎產品。

它被廣泛的應用與跨平臺、跨系統的分布式系統之間,為它們提供高效可靠的異步傳輸機制。

  • 消息通道(Message Channel)

使用MQ將彼此協作的客戶端和服務端連接起來,使他們可以交換消息。

技術分享圖片

如客戶端與服務端需要安全可靠的交互,可以將一個MQ的隊列作為安全通道,是客戶端與服務端能夠安全高效的進行異步通訊。

  • 消息總線(Message Bus)

對於由許多獨立開發的服務組成的分布式系統,倘若要將它們組成一個完整的系統,這些服務必須能夠可靠地交互,同時,為了系統的健壯性,

每個服務之間又不能產生過分緊密的依賴關系,這樣就可以通過消息總線將不同的服務連接起來,允許它們異步的傳遞數據。

技術分享圖片

  • 消息路由(Message Router)

通過消息路由,可以將發送到MQ指定隊列的消息根據規則路由到不同的隊列。

技術分享圖片

此外,JMS規範還支持通過selector條件,對消息進行過濾,可以用多個消費者消費同一個隊列的消息,每個消費者只消費自己感興趣的消息。

  • 發布/訂閱(Publicsher/Subscriber)

發布/訂閱模式用於一對多的通訊,當消息發布者向一個主題(Topic)發送一條消息後,該主題的所有訂閱者都會收到這條消息。

文章標簽: 網絡安全jms開源項目面試

AMQP協議介紹