JMS詳細的工作原理【轉】

Franson發表於2016-06-15

如果手機只能進行實時通話,沒有留言和簡訊功能會怎麼樣?一個電話打過來,正好沒有來得及接上,那麼這個電話要傳遞的資訊肯定就收不到了。為什麼不能先將資訊存下來,當使用者需要檢視資訊的時候再去獲得資訊呢?伴隨著這個疑惑,短息和留言應運而生,無論手機是否開機、是否未及時接到,我們都能得到其中的資訊。JMS提供了類似這樣的功能,本章我們將系統的學習JMS中的相關重要內容。

企業訊息系統

      Java Message Service是由Sun開發的,它為 Java程式提供一種訪問企業訊息系統的方法。在討論JMS之前,我們分來析一下企業訊息系統。 
      企業訊息系統,即面向訊息的中介軟體(MOM),提供了以鬆散耦合的靈活方式整合應用程式的一種機制。它們提供了基於儲存和轉發的應用程式之間的非同步資料傳送,即應用程式彼此不直接通訊,而是與作為中介的MOM 通訊。MOM提供了有保證的訊息傳送,應用程式開發人員無需瞭解遠端過程呼叫(PRC)和網路/通訊協議的細節。ActiveMQ正是MOM中優秀的一員。

企業訊息系統的好處

我們先來看看下圖,應用程式A將Message傳送到伺服器上,然後應用程式B從伺服器中接收A發來的訊息,通過這個圖我們一起來分析一下JMS的好處

image

圖 1 JMS通訊示意圖

提供訊息靈活性

      應用程式A與應用程式B通過使用MOM的應用程式程式設計介面(API)傳送訊息進行通訊。MOM 將訊息路由給應用程式B,這樣訊息就可以存在於MOM中,MOM 負責處理網路通訊。如果網路連線不可用,MOM會儲存訊息,直到連線變得可用時,再將訊息轉發給應用程式B。 
      靈活性的另一方面體現在,當應用程式A傳送其訊息時,應用程式B甚至可以不處於執行狀態。MOM將保留這個訊息,直到應用程式B開始執行並試著檢索訊息為止。這還防止了應用程式A因為等待應用程式B檢索訊息而出現阻塞。 
      這種非同步通訊要求應用程式的設計與現在大多數應用程式不同,不過對於時間無關或並行處理,它可能是一個極其有用的方法。

鬆散耦合

      企業訊息系統的真正威力在於應用程式的鬆散耦合。在上面的圖中,由應用程式A傳送訊息指定一個特定目標,如“訂單處理”。而現在,是由應用程式B提供訂單處理功能。 
      但是在將來,我們可以用不同的訂單處理程式替換應用程式B,應用程式A將不再是明智之選。替換應用程式將繼續傳送訊息完成“訂單處理”,而訊息也仍將得到處理。 
      同樣,我們也可以替換應用程式A,只要替換應用程式繼續傳送訊息進行“訂單處理”,訂單處理程式就無需知道是否有一個新的應用程式在傳送訂單。

JMS是什麼

      JMS是一系列的介面及相關語義的集合,通過這些介面和和其中的方法,JMS客戶端如何去訪問訊息系統,完成建立、傳送、接收和讀取企業訊息系統中訊息。 
      在JMS之前,每一家MOM廠商都用專有API為應用程式提供對其產品的訪問,通常可用於許多種語言,其中包括Java語言。JMS通過MOM為Java程式提供了一個傳送和接收訊息的標準的、便利的方法。用JMS編寫的程式可以在任何實現JMS標準的MOM上執行。 
      JMS可移植性的關鍵在於:JMS API是由Sun作為一組介面而提供的。提供了JMS功能的產品是通過提供一個實現這些介面的提供者來做到這一點的。開發人員可以通過定義一組訊息和一組交換這些訊息的應用程式,建立JMS應用程式,實現非同步通訊。

JMS的目標

      JMS從提出以來,致力於完成如下幾個目標: 
定義一組訊息公用概念和實用工具。 
      
所有Java應用程式都可以使用JMS中定義的API去完成訊息的建立、接收與傳送,任何實現了JMS標準的MOM都可以作為訊息的中介,完成訊息的儲存轉發。 
最大化訊息應用程式的可移植性。 
      
MOM提供了有保證的訊息傳送,應用程式開發人員無需瞭解遠端過程呼叫(PRC)和網路/通訊協議的細節,提供了程式的可移植性。 
最大化降低應用程式與應用系統之間的耦合度。 
      
由於MOM的存在,各個應用程式只關心和MOM之間如何進行訊息的接收與傳送,而無需關注MOM的另一邊,其他程式是如何接收和傳送的。

JMS兩種訊息模型

JMS提供了兩種訊息通訊模型:

      Ø 點到點(P2P)模型

      Ø 釋出/訂閱(Pub/Sub)模型

clip_image010

圖 2 JMS通訊模型

從圖中可以看出,ClientA和ClientB是訊息生產者,通過兩種不同的目的地分別向ClientC、ClientD、ClientE和ClientF傳送訊息。 
      在ClientA、C、D之間的訊息是點對點模型,使用這種模型,客戶端傳送訊息到佇列目的地(Queue),從這個佇列裡面只有一個訊息接收者可以收到那個訊息,其他訪問同一目的地的接收者不會接收到該訊息。如ClientC接收Queue中的Msg1訊息,ClientD接收Queue中的Msg2訊息。 
      在ClientB、E、F之間的訊息是釋出/訂閱模型。使用這種廣播模型,一個客戶端傳送訊息給主題目的地(Topic),任何數量的消費訂閱者可以從這個主題目的地來接收它們。如:ClientE和ClientF都接收這個Msg3這條訊息。

點到點模型

點對點傳遞模型:生產者傳送訊息到一個特定的佇列(Queue)中,而消費者從一個訊息佇列中得到訊息,如下圖所示:

image

圖 3 點到點通訊模型示意圖

點對點模型的特點:

Ø  每條訊息有一個消費者

      每條只有一個消費者,如果一條訊息被訊息者接收,那麼其他的消費者就不能得到這條訊息了。

Ø 傳送和接受訊息與時間沒有關係

      也就是說,生產者在傳送訊息後,消費者可以在任意的時刻接收,但有兩個前提:

            1、訊息未過期

            2、訊息沒有被其他的使用者接收

      消費者也可以先執行,當生產者一執行,將訊息傳送到佇列中,消費者即可從佇列中獲得訊息,這叫“守株待兔“。

Ø  消費者必須確認對訊息的接收

      收到訊息後消費者必須確認訊息已被接收,否則JMS服務提供者會認為該訊息沒有被接收,那麼這條訊息仍然可以被其他人接收。程式可以自動進行確認,不需要人工干預。

Ø  非持久的訊息最多隻傳送一次

      非持久的訊息最多隻傳送一次,表示訊息有可能未被髮送,造成未被髮送的原因可能有:

            1、 JMS服務提供者出現當機等情況,造成非持久資訊的丟失

            2、 佇列中的訊息過期,未被接收

Ø  持久的訊息嚴格傳送一次

      我們可以將比較重要的訊息設定為持久化的訊息,持久化後的訊息不會因為JMS服務提供者的故障或者其他原因造成訊息丟失。

釋出/訂閱模型

      釋出/訂閱模型:釋出/訂閱傳遞訊息型別與主題(Topic)有關。生產者釋出訊息,而消費者訂閱感興趣的訊息,生產者將訊息和一個特定的主題(Topic)連在一起,訊息傳遞系統(MOM)根據消費者註冊的興趣,將訊息傳遞給消費者。這種型別非常類似出版報紙、雜誌的形式,如下圖所示:

image

圖 4 釋出/訂閱通訊模型示意圖

釋出/訂閱模型的特點:

Ø  每個訊息都可以有多個(0,1,……)訂閱者

      每條訊息可以有多個消費者,如果報紙和雜誌一樣,誰訂閱了誰都可以獲得。

Ø  訂閱者只能消費他們訂閱之後出版的訊息

      這就要求訂閱者必須先訂閱,生產者再發布。即訂閱者必須先執行,再等待生產者的執行,這和點對點型別有所差異。

Ø  訂閱者必須保持為活動狀態才能使用這些訊息

      即訂閱者必須保持活動狀態等待發布者釋出的訊息,如果訂閱者在釋出者釋出訊息之後才執行,則不能獲得先前釋出者釋出的訊息。

相關文章