異步處理、應用解耦、流量削峯和信息通信四個場景前端
假設三個業務節點每一個使用50毫秒鐘,不考慮網絡等其餘開銷,則串行方式的時間是150毫秒, 並行的時間多是100毫秒。 由於CPU在單位時間內處理的請求數是必定的,假設CPU在1秒內吞吐量是100次。則串行方式1秒 內CPU可處理的請求量是7次(1000/150)。並行方式處理的請求量是10次(1000/100) 小結:如以上案例描述,傳統的方式系統的性能(併發量,吞吐量,響應時間)會有瓶頸。如何解 決這個問題呢? 引入消息隊列,將不是必須的業務邏輯,進行異步處理。改造後的架構以下:
傳統模式的缺點:數據庫
以上問題如何解決?引入應用消息隊列後的方案,以下圖:服務器
訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單。下單成功 庫存系統:訂閱下單的消息,採用pub/sub(發佈/訂閱)的方式,獲取下單信息,庫存系統根據 下單信息,進行庫存操做 假如:在下單時庫存系統不能正常使用。也不影響正常下單,由於下單後,訂單系統寫入消息 隊列就再也不關心其餘的後續操做了。實現訂單系統與庫存系統的應用解耦
日誌處理是指將消息隊列用在日誌處理中,好比Kafka的應用,解決大量日誌傳輸的問題。架構簡化以下 網絡
1)Kafka:接收用戶日誌的消息隊列 2)Logstash:作日誌解析,統一成JSON輸出給Elasticsearch 3)Elasticsearch:實時日誌分析服務的核心技術,一個schemaless,實時的數據存儲服務,經過index組織數據, 兼具強大的搜索和統計功能 4)Kibana:基於Elasticsearch的數據可視化組件,超強的數據可視化能力是衆多公司選擇ELKstack的重要緣由
消息通信是指,消息隊列通常都內置了高效的通訊機制,所以也能夠用在純的消息通信。好比實現點對點消息隊列,或者聊天室等架構
客戶端A和客戶端B使用同一隊列,進行消息通信。併發
客戶端A,客戶端B,客戶端N訂閱同一主題,進行消息發佈和接收。實現相似聊天室效果。以上實際是消息隊列的兩種消息模式,點對點或發佈訂閱模式。模型爲示意圖,供參考。less
消息隊列的JavaEE規範JMS。JMS(Java Message Service即Java消息服務) API是一個信息服務的標準/規範,容許應用程序組件基於JavaEE平臺建立、發送、接收和讀取消息。它使分佈式通訊耦合度更低,消息服務更加可靠以及異步性。異步
在JMS標準中,有兩種消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。分佈式
P2P模式包含三個角色:消息隊列(Queue),發送者(Sender)、接收者(Receiver)。每一個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留着消息,知道他們被消費或超時。性能
若是但願發送的每一個消息都會被成功處理的話,那麼須要P2P模式。
包含三個角色:主題(Topic)、發佈者(Publisher)、訂閱者(Subscriber)多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
爲了緩和這樣嚴格的時間相關性,JMS容許訂閱者建立一個可持久化的訂閱。這樣,即便訂閱者沒有被激活(運行),它也能接收到發佈者的信息。
若是但願發送的消息能夠被多個消費者處理的話,那麼能夠採用Pub/Sub模式
在JMS中,消息的產生和消費都是異步的。對於消費來講,JMS的消費者能夠經過兩種方式來消費消息。
1)同步: 訂閱者或接收者經過receive方法來接收消息,receive在接收消息以前(或超時以前)將一直堵塞; 2)異步 訂閱者或消費者能夠註冊爲一個消息監聽器。當消息到達以後,系統自動調用監聽器的onMessage方法。