詳解JMS與消息中間件

JMS(Java Messaging Service)是Java平臺上有關面向消息中間件的技術規範,其實是一套api,它便於消息系統中的Java應用程序進行消息交換,而且經過提供標準的產生、發送、接收消息的接口簡化企業應用的開發,消息中間件是這個規範的一個具體實現。前端

JMS規範中的消息

JMS 消息由如下三部分組成:數據庫

  • · 消息頭。每一個消息頭字段都有相應的getter 和setter 方法。
  • · 消息屬性。若是須要除消息頭字段之外的值,那麼可使用消息屬性。
  • · 消息體。JMS 定義的消息類型有TextMessage、MapMessage、BytesMessage、StreamMessage 和 ObjectMessage。

JMS消息模型

Point-to-Point(P2P) / 點對點api

詳解JMS與消息中間件

 

消息經過稱爲隊列的一個虛擬通道來進行交換。隊列是生產者發送消息的目的地和接受者消費消息的消息源。服務器

每條消息通僅會傳送給一個接受者。可能會有多個接受者在一個隊列中偵聽,可是每一個隊列中的消息只能被隊列中的一個接受者消費。網絡

消息存在前後順序。一個隊列會按照消息服務器將消息放入隊列中的順序,把它們傳送給消費者當消息已被消費時,就會從隊列頭部將它們刪除。架構

每一個消息只有一個消費者(Consumer)(即一旦被消費,消息就再也不在消息隊列中)併發

發送者發送了消息以後,無論接收者有沒有正在運行,它不會影響到消息被髮送到隊列異步

接收者在成功接收消息以後需向隊列應答成功性能

若是但願發送的每一個消息都應該被成功處理的話,使用這個P2P模式。spa

Topic/ 主題(發佈訂閱(Pub/Sub) )

詳解JMS與消息中間件

 

一、消息生產者(發佈)將消息發佈到topic中,同時有多個消息消費者(訂閱)消費該消息。和點對點方式不一樣,發佈到topic的消息會被全部訂閱者消費。

二、若是你但願發送的消息能夠不被作任何處理、或者被一個消息者處理、或者能夠被多個消費者處理的話,那麼能夠採用topic模型

常見的消息中間件

詳解JMS與消息中間件

 

消息中間件有些什麼使用場景?

1、異步處理

場景說明:用戶註冊後,須要發註冊郵件和註冊短信。傳統的作法有兩種1.串行的方式;2.並行方式。

串行方式:將註冊信息寫入數據庫成功後,發送註冊郵件,再發送註冊短信。以上三個任務所有完成後,返回給客戶端。

詳解JMS與消息中間件

 

(2)並行方式:將註冊信息寫入數據庫成功後,發送註冊郵件的同時,發送註冊短信。以上三個任務完成後,返回給客戶端。與串行的差異是,並行的方式能夠提升處理的時間。

假設三個業務節點每一個使用50毫秒鐘,不考慮網絡等其餘開銷,則串行方式的時間是150毫秒,並行的時間多是100毫秒。

詳解JMS與消息中間件

 

小結:如以上案例描述,傳統的方式系統的性能(併發量,吞吐量,響應時間)會有瓶頸。如何解決這個問題呢?

引入消息隊列,將不是必須的業務邏輯,異步處理。

詳解JMS與消息中間件

 

按照以上約定,用戶的響應時間至關因而註冊信息寫入數據庫的時間,也就是50毫秒。註冊郵件,發送短信寫入消息隊列後,直接返回,所以寫入消息隊列的速度很快,基本能夠忽略,所以用戶的響應時間多是50毫秒。所以架構改變後,系統的吞吐量提升到每秒20 QPS。比串行提升了3倍,比並行提升了兩倍。

2、應用解耦

場景說明:用戶下單後,訂單系統須要通知庫存系統。傳統的作法是,訂單系統調用庫存系統的接口。

傳統模式的缺點:

1) 假如庫存系統沒法訪問,則訂單減庫存將失敗,從而致使訂單失敗;

2) 訂單系統與庫存系統耦合;

詳解JMS與消息中間件

 

如何解決以上問題呢?引入應用消息隊列後的方案

訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功。

庫存系統:訂閱下單的消息,採用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操做。

詳解JMS與消息中間件

 

假如:在下單時庫存系統不能正常使用。也不影響正常下單,由於下單後,訂單系統寫入消息隊列就再也不關心其餘的後續操做了。實現訂單系統與庫存系統的應用解耦。

3、流量削峯

流量削峯也是消息隊列中的經常使用場景,通常在秒殺或團搶活動中使用普遍。

應用場景:秒殺活動,通常會由於流量過大,致使流量暴增,應用掛掉。爲解決這個問題,通常須要在應用前端加入消息隊列:能夠控制活動的人數;能夠緩解短期內高流量壓垮應用。

詳解JMS與消息中間件

 


用戶的請求,服務器接收後,首先寫入消息隊列。假如消息隊列長度超過最大數量,則直接拋棄用戶請求或跳轉到錯誤頁面;秒殺業務根據消息隊列中的請求信息,再作後續處理。

4、日誌處理

日誌處理是指將消息隊列用在日誌處理中,好比Kafka的應用,解決大量日誌傳輸的問題。架構簡化以下:

詳解JMS與消息中間件

 

日誌採集客戶端,負責日誌數據採集,定時寫入Kafka隊列:Kafka消息隊列,負責日誌數據的接收,存儲和轉發;日誌處理應用:訂閱並消費kafka隊列中的日誌數據。

相關文章
相關標籤/搜索