1. 程式人生 > >訊息佇列mq的原理及實現方法

訊息佇列mq的原理及實現方法

訊息佇列技術是分散式應用間交換資訊的一種技術。訊息佇列可駐留在記憶體或磁碟上,佇列儲存訊息直到它們被應用程式讀走。通過訊息佇列,應用程式可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此訊息。

訊息中介軟體概述

訊息佇列技術是分散式應用間交換資訊的一種技術。訊息佇列可駐留在記憶體或磁碟上,佇列儲存訊息直到它們被應用程式讀走。通過訊息佇列,應用程式可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此訊息。

在分散式計算環境中,為了整合分散式應用,開發者需要對異構網路環境下的分散式應用提供有效的通訊手段。為了管理需要共享的資訊,對應用提供公共的資訊交換機制是重要的。

設計分散式應用的方法主要有:遠端過程呼叫(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)等知識。

目前中介軟體的種類很多,如交易管理中介軟體(如IBM的CICS)、面向Java應用的Web應用伺服器中介軟體(如IBM的WebSphereApplicationServer)等,而訊息傳輸中介軟體(MOM)是其中的一種。它簡化了應用之間資料的傳輸,遮蔽底層異構作業系統和網路平臺,提供一致的通訊標準和應用開發,確保分散式計算網路環境下可靠的、跨平臺的資訊傳輸和資料交換。它基於訊息佇列的儲存-轉發機制,並提供特有的非同步傳輸機制,能夠基於訊息傳輸和非同步事務處理實現應用整合與資料交換。

IBM訊息中介軟體MQ以其獨特的安全機制、簡便快速的程式設計風格、卓越不凡的穩定性、可擴充套件性和跨平臺性,以及強大的事務處理能力和訊息通訊能力,成為業界市場佔有率最高的訊息中介軟體產品。

MQ具有強大的跨平臺性,它支援的平臺數多達35種。它支援各種主流Unix作業系統平臺,如:HP-UX、AIX、SUNSolaris、Digital UNIX、Open VMX、SUNOS、NCRUNIX;支援各種主機平臺,如:OS/390、MVS/ESA、VSE/ESA;同樣支援WindowsNT伺服器。在PC平臺上支援Windows9X/Windows NT/Windows 2000和UNIX(UnixWare、Solaris)以及主要的Linux版本(Redhat、TurboLinux等)。此外,MQ還支援其他各種作業系統平臺,如:OS/2、AS/400、SequentDYNIX、SCO OpenServer、SCO UnixWare、Tandem等。

MQ的基本概念:

1) 佇列管理器

佇列管理器是MQ系統中最上層的一個概念,由它為我們提供基於佇列的訊息服務。

2) 訊息

在MQ中,我們把應用程式交由MQ傳輸的資料定義為訊息,我們可以定義訊息的內容並對訊息進行廣義的理解,比如:使用者的各種型別的資料檔案,某個應用向其它應用發出的處理請求等都可以作為訊息。訊息有兩部分組成:

訊息描述符(Message Discription或MessageHeader),描述訊息的特徵,如:訊息的優先順序、生命週期、訊息Id等;

訊息體(MessageBody),即使用者資料部分。在MQ中,訊息分為兩種型別,非永久性(non-persistent)訊息和永久性(persistent)訊息,非永久性訊息是儲存在記憶體中的,它是為了提高效能而設計的,當系統掉電或MQ佇列管理器重新啟動時,將不可恢復。當用戶對訊息的可靠性要求不高,而側重系統的效能表現時,可以採用該種類型的訊息,如:當釋出股票資訊時,由於股票資訊是不斷更新的,我們可能每若干秒就會發布一次,新的訊息會不斷覆蓋舊的訊息。永久性訊息是儲存在硬碟上,並且紀錄資料日誌的,它具有高可靠性,在網路和系統發生故障等情況下都能確保訊息不丟、不重。

此外,在MQ中,還有邏輯訊息和物理訊息的概念。利用邏輯訊息和物理訊息,我們可以將大訊息進行分段處理,也可以將若干個本身完整的訊息在應用邏輯上歸為一組進行處理。

3) 佇列

佇列是訊息的安全存放地,佇列儲存訊息直到它被應用程式處理。

訊息佇列以下述方式工作:

a)      程式A形成對訊息佇列系統的呼叫,此呼叫告知訊息佇列系統,訊息準備好了投向程式B;

b) 訊息佇列系統傳送此訊息到程式B駐留處的系統,並將它放到程式B的佇列中;

c) 適當時間後,程式B從它的佇列中讀此訊息,並處理此資訊。

由於採用了先進的程式設計思想以及內部工作機制,MQ能夠在各種網路條件下保證訊息的可靠傳遞,可以克服網路線路質量差或不穩定的現狀,在傳輸過程中,如果通訊線路出現故障或遠端的主機發生故障,本地的應用程式都不會受到影響,可以繼續傳送資料,而無需等待網路故障恢復或遠端主機正常後再重新執行。

在MQ中,佇列分為很多種型別,其中包括:本地佇列、遠端佇列、模板佇列、動態佇列、別名佇列等。

本地佇列又分為普通本地佇列和傳輸佇列,普通本地佇列是應用程式通過API對其進行讀寫操作的佇列;傳輸佇列可以理解為儲存-轉發佇列,比如:我們將某個訊息交給MQ系統傳送到遠端主機,而此時網路發生故障,MQ將把訊息放在傳輸佇列中暫存,當網路恢復時,再發往遠端目的地。

遠端佇列是目的佇列在本地的定義,它類似一個地址指標,指向遠端主機上的某個目的佇列,它僅僅是個定義,不真正佔用磁碟儲存空間。

模板佇列和動態佇列是MQ的一個特色,它的一個典型用途是用作系統的可擴充套件性考慮。我們可以建立一個模板佇列,當今後需要新增佇列時,每開啟一個模板佇列,MQ便會自動生成一個動態佇列,我們還可以指定該動態佇列為臨時佇列或者是永久佇列,若為臨時佇列我們可以在關閉它的同時將它刪除,相反,若為永久佇列,我們可以將它永久保留,為我所用。

4) 通道

通道是MQ系統中佇列管理器之間傳遞訊息的管道,它是建立在物理的網路連線之上的一個邏輯概念,也是MQ產品的精華。

在MQ中,主要有三大類通道型別,即訊息通道,MQI通道和Cluster通道。訊息通道是用於在MQ的伺服器和伺服器之間傳輸訊息的,需要強調指出的是,該通道是單向的,它又有傳送(sender),接收(receive), 請求者(requestor), 服務者(server)等不同型別,供使用者在不同情況下使用。MQI通道是MQClient和

MQI通道是MQ Client和MQServer之間通訊和傳輸訊息用的,與訊息通道不同,它的傳輸是雙向的。群集(Cluster)通道是位於同一個MQ群集內部的佇列管理器之間通訊使用的。
 

MQ的工作原理(圖見附件)

 

首先來看本地通訊的情況,應用程式A和應用程式B運行於同一系統A,它們之間可以藉助訊息佇列技術進行彼此的通訊:應用程式A向佇列1傳送一條資訊,而當應用程式B需要時就可以得到該資訊。

其次是遠端通訊的情況,如果資訊傳輸的目標改為在系統B上的應用程式C,這種變化不會對應用程式A產生影響,應用程式A向佇列2傳送一條資訊,系統A的MQ發現Q2所指向的目的佇列實際上位於系統B,它將資訊放到本地的一個特殊佇列-傳輸佇列(TransmissionQueue)。我們建立一條從系統A到系統B的訊息通道,訊息通道代理將從傳輸佇列中讀取訊息,並傳遞這條資訊到系統B,然後等待確認。只有MQ接到系統B成功收到資訊的確認之後,它才從傳輸佇列中真正將該資訊刪除。如果通訊線路不通,或系統B不在執行,資訊會留在傳輸佇列中,直到被成功地傳送到目的地。這是MQ最基本而最重要的技術--確保資訊傳輸,並且是一次且僅一次(once-and-only-once)的傳遞。

MQ提供了用於應用整合的鬆耦合的連線方法,因為共享資訊的應用不需要知道彼此物理位置(網路地址);不需要知道彼此間怎樣建立通訊;不需要同時處於執行狀態;不需要在同樣的作業系統或網路環境下執行。

MQ的基本配置舉例


在上圖中,要實現網路上兩臺主機上的通訊,若採用點對點的通訊方式,我們至少要建立如下MQ的物件:

在傳送方A:

1) 建立佇列管理器QMA: crtmqm -q QMA

2) 定義本地傳輸佇列: define qlocal (QMB) usage (xmitq) defpsist(yes)

3) 建立遠端佇列: define qremote (QR.TOB) rname (LQB) rqmname (QMB) xmitq(QMB)

4) 定義傳送通道: define channel (A.TO.B) chltype (sdr) conname ('IP ofB') xmitq (QMB) + trptype (tcp)

在接收方B:

1) 建立佇列管理器QMB: crtmqm -q QMB

2) 定義本地佇列QLB: define qlocal (LQB)

3) 建立接收通道: define channel (A.TO.B) chltype (rcvr) trptype(tcp)

經過上述配置,我們就可以實現從主機A到B的單向通訊,若要實現二者之間的雙向通訊,可參考此例建立所需要的MQ物件。

MQ的通訊模式


1)點對點通訊:點對點方式是最為傳統和常見的通訊方式,它支援一對一、一對多、多對多、多對一等多種配置方式,支援樹狀、網狀等多種拓撲結構。

2)多點廣播:MQ適用於不同型別的應用。其中重要的,也是正在發展中的是"多點廣播"應用,即能夠將訊息傳送到多個目標站點(DestinationList)。可以使用一條MQ指令將單一訊息傳送到多個目標站點,並確保為每一站點可靠地提供資訊。MQ不僅提供了多點廣播的功能,而且還擁有智慧訊息分發功能,在將一條訊息傳送到同一系統上的多個使用者時,MQ將訊息的一個複製版本和該系統上接收者的名單傳送到目標MQ系統。目標MQ系統在本地複製這些訊息,並將它們傳送到名單上的佇列,從而儘可能減少網路的傳輸量。

3)釋出/訂閱(Publish/Subscribe)模式:釋出/訂閱功能使訊息的分發可以突破目的佇列地理指向的限制,使訊息按照特定的主題甚至內容進行分發,使用者或應用程式可以根據主題或內容接收到所需要的訊息。釋出/訂閱功能使得傳送者和接收者之間的耦合關係變得更為鬆散,傳送者不必關心接收者的目的地址,而接收者也不必關心訊息的傳送地址,而只是根據訊息的主題進行訊息的收發。在MQ家族產品中,MQEventBroker是專門用於使用釋出/訂閱技術進行資料通訊的產品,它支援基於佇列和直接基於TCP/IP兩種方式的釋出和訂閱。

4)群集(Cluster):為了簡化點對點通訊模式中的系統配置,MQ提供Cluster(群集)的解決方案。群集類似於一個域(Domain),群集內部的佇列管理器之間通訊時,不需要兩兩之間建立訊息通道,而是採用群集(Cluster)通道與其它成員通訊,從而大大簡化了系統配置。此外,群集中的佇列管理器之間能夠自動進行負載均衡,當某一佇列管理器出現故障時,其它佇列管理器可以接管它的工作,從而大大提高系統的高可靠性。

相關推薦

訊息佇列mq原理實現方法

訊息佇列技術是分散式應用間交換資訊的一種技術。訊息佇列可駐留在記憶體或磁碟上,佇列儲存訊息直到它們被應用程式讀走。通過訊息佇列,應用程式可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此訊息。 訊息中介軟體概述 訊息佇列技術是分散式應用間交

基於redis的訊息佇列的設計實現

訊息佇列 所謂訊息佇列,就是一個以佇列資料結構為基礎的一個真實存在的實體,如陣列,redis中的佇列集合等等,都可以。 為什麼要使用佇列 主要原因是由於在高併發環境下,由於來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達MySQL,直接導致無

剖析nsq訊息佇列(一) 簡介去中心化實現原理

分散式訊息佇列nsq,簡單易用,去中心化的設計使nsq更健壯,nsq充分利用了go語言的goroutine和channel來實現的訊息處理,程式碼量也不大,讀不了多久就沒了。後期的文章我會把nsq的原始碼分析給大家看。 主要的分析路線如下 分析nsq的整體框架結構,分析如何做到的無中心化分散式拓撲結構,如何

佇列的基礎知識實現方法

佇列   在網上又看到關於佇列的知識點,有很多,但都比較瑣碎,有的還有些錯誤,為方便自己理解,特整理出一篇,順便也加強記憶;當然,也附上我參考的部落格地址: http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2

訊息佇列MQ技術的介紹和原理

訊息佇列技術是分散式應用間交換資訊的一種技術。訊息佇列可駐留在記憶體或磁碟上,佇列儲存訊息直到它們被應用程式讀走。通過訊息佇列,應用程式可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此訊息。   訊息中介軟體概述    訊息佇列技術是分散式

pageHelper分頁外掛實現原理使用方法

外掛官方網站:https://github.com/pagehelper/Mybatis-PageHelper/tree/master/src/main/java/com/github/pagehel

訊息佇列MQ, rabbitMQ和rocketMQ的實現方式

MQ全稱為Message Queue, 訊息佇列(MQ)是一種應用程式對應用程式的通訊方法。應用程式通過讀寫出入佇列的訊息(針對應用程式的資料)來通訊,而無需專用連線來連結它們。訊息傳遞指的是程式之間通過在訊息中傳送資料進行通訊,而不是通過直接呼叫彼此來通訊,直接呼叫通常是用

【資料結構】堆疊、佇列原理java實現

一、堆是一個執行時資料區,通過new等指令建立,不需要程式程式碼顯式釋放 <1>優點: 可動態分配記憶體大小,生存週期不必事先告訴編譯器,Java垃圾回收自動回收不需要的資料; <2>缺點: 執行時需動態分配記憶體,資料存取速度較

【CSII-PE】dmconfig.xml實現原理配置方法

在一部分bundle的程式碼中(例如com.csii.gateway.api),在META-INF目錄下有個peconfig目錄,其中有一個dmconfig.xml檔案。這個檔案中有一些配置資訊: <?xml version="1.0" encoding="UTF

使用jedis實現Redis訊息佇列(MQ)的釋出(publish)和訊息監聽(subscribe)

前言: 本文基於jedis 2.9.0.jar、commons-pool2-2.4.2.jar以及json-20160810.jar 其中jedis連線池需要依賴commons-pool2包,json

PHP介面繼承介面多繼承原理實現方法詳解

在PHP的介面中,介面可以繼承介面。雖然PHP類只能繼承一個父類(單繼承),但是介面和類不同,介面可以實現多繼承,可以繼承一個或者多個介面。當然介面的繼承也是使用extends關鍵字,要多個繼承的話只要用逗號把繼承的介面隔開即可。 需要注意的是當你介面繼承其它介面時候,

GPIO-KEY的實現原理使用方法

本文將以imx6q的板子和相應BSP程式碼來詳細描述在linux下, 使用GPIO當做按鍵的實現原理及使用方法。 Linux 核心下的 drivers/input/keyboard/gpio_keys.c實現了一個體繫結構無關的GPIO按鍵驅動,使用此按鍵驅動,只需在相應的

Tomcat實現Session物件的持久化原理配置方法介紹

    當一個Session開始時,Servlet容器會為Session建立一個HttpSession物件。Servlet容器在某些情況下把這些 HttpSession物件從記憶體中轉移到檔案系統或資料庫中,在需要訪問 HttpSession資訊時再把它們載入到記憶體中。 實現: 要完成session持久化

訊息佇列MQ實踐----實現Queue(佇列訊息)和Topic(主題訊息)兩種模式

之前有篇檔案介紹了生產消費者模式(http://blog.csdn.net/canot/article/details/51541920 ),當時是通過BlockingQueue阻塞佇列來實現,以及在Redis中使用pub/sub模式(http://blog.csdn.ne

[從今天開始修煉資料結構]佇列、迴圈佇列、PriorityQueue的原理實現

[從今天開始修煉資料結構]基本概念 [從今天開始修煉資料結構]線性表及其實現以及實現有Itertor的ArrayList和LinkedList [從今天開始修煉資料結構]棧、斐波那契數列、逆波蘭四則運算的實現 [從今天開始修煉資料結構]佇列、迴圈佇列、PriorityQueue的原理及實現 一、什麼是佇列  

基於迴圈佇列的BFS的原理實現

>文章首發於微信公眾號:幾何思維 # 1.故事起源 有一隻螞蟻出去尋找食物,無意中進入了一個迷宮。螞蟻只能向上、下、左、右4個方向走,迷宮中有牆和水的地方都無法通行。這時螞蟻犯難了,怎樣才能找出到食物的最短路徑呢? # 2.思考 螞蟻在起點時,有4個選擇,可以向上、下、左、右某一個方向走1步。 如

【Spark 深入學習-08】說說Spark分區原理優化方法

學習 格式 讀取文件 tmc 資料 數值計算 詳解 shc 存儲介質 本節內容 ------------------ · Spark為什麽要分區 · Spark分區原則及方法 · Spark分區案例 · 參考

關於base64編碼的原理實現

一個 replace 編碼範圍 func nco 都是 style bit 如果 我們的圖片大部分都是可以轉換成base64編碼的data:image。 這個在將canvas保存為img的時候尤其有用。雖然除ie外,大部分現代瀏覽器都已經支持原生的基於base64的enco

java設計模式singleton原理實現

最新 不必要 -- 不同 適合 所有 引用 ati cnblogs 題外話:我要變強,要變強,變強,強。 1、 Singleton的應用場景以及為什麽要使用singleSingleton是一生只能有一個實例的對象。只能由singleton自身創建一個實例。外人是無法創建實例

決策樹原理實現

方式 -1 變化 log nbsp 導致 結點 以及 重要 1、決策樹原理 1.1、定義 分類決策樹模型是一種描述對實例進行分類的樹形結構。決策樹由結點和有向邊組成。結點有兩種類型:內部節點和葉節點,內部節點表示一個特征或屬性,葉節點表示一個類。