MQ理論知識

1.消息隊列應用場景

異步處理、應用解耦、流量削峯和信息通信四個場景前端

1.1 異步處理

  • 場景說明:用戶註冊後,須要發註冊郵件和註冊短信。傳統的作法有兩種: 1.串行方式;2.並行方式
    • 1.串行方式:將註冊信息寫入 數據庫 成功後,發送註冊郵件,再發送註冊短信。以上三個任務所有完成後,返回給客戶端
    • 2.並行方式: 將註冊信息寫入數據庫成功後,發送註冊郵件的同時,發送註冊短信。以上三個任務完成後,返回給客戶端。與串行的差異是,並行的方式能夠提升處理的時間
假設三個業務節點每一個使用50毫秒鐘,不考慮網絡等其餘開銷,則串行方式的時間是150毫秒,
並行的時間多是100毫秒。
   由於CPU在單位時間內處理的請求數是必定的,假設CPU在1秒內吞吐量是100次。則串行方式1秒
內CPU可處理的請求量是7次(1000/150)。並行方式處理的請求量是10次(1000/100)
   小結:如以上案例描述,傳統的方式系統的性能(併發量,吞吐量,響應時間)會有瓶頸。如何解
決這個問題呢?
引入消息隊列,將不是必須的業務邏輯,進行異步處理。改造後的架構以下:

1.2 應用解耦

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

  • 傳統模式的缺點:數據庫

      1. 加入庫存系統沒法訪問,則訂單減庫存將失敗,從而致使訂單失敗
      1. 訂單系統與庫存系統耦合
  • 以上問題如何解決?引入應用消息隊列後的方案,以下圖:服務器

訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單。下單成功
庫存系統:訂閱下單的消息,採用pub/sub(發佈/訂閱)的方式,獲取下單信息,庫存系統根據
	 下單信息,進行庫存操做
假如:在下單時庫存系統不能正常使用。也不影響正常下單,由於下單後,訂單系統寫入消息
     隊列就再也不關心其餘的後續操做了。實現訂單系統與庫存系統的應用解耦

1.3 流量削峯

  • 應用場景:秒殺活動,通常會由於流量過大,致使流量暴增,應用掛掉。爲解決這個問題,通常須要在應用前端加入消息隊列。
    • 1.能夠控制活動人數
    • 2.能夠緩解短期內高流量壓垮應用
    • 3.用戶請求,服務器接收後,首先寫入消息隊列。假如消息隊列長度超過最大數量,則直接拋棄用戶請求或跳轉到錯誤頁面
    • 4.秒殺業務根據消息隊列中的請求信息,再作後續處理

1.4 日誌處理

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

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

1)Kafka:接收用戶日誌的消息隊列
 2)Logstash:作日誌解析,統一成JSON輸出給Elasticsearch
 3)Elasticsearch:實時日誌分析服務的核心技術,一個schemaless,實時的數據存儲服務,經過index組織數據,
 		   兼具強大的搜索和統計功能
 4)Kibana:基於Elasticsearch的數據可視化組件,超強的數據可視化能力是衆多公司選擇ELKstack的重要緣由

1.5 消息通信

消息通信是指,消息隊列通常都內置了高效的通訊機制,所以也能夠用在純的消息通信。好比實現點對點消息隊列,或者聊天室等架構

  • 點對點通信:

客戶端A和客戶端B使用同一隊列,進行消息通信。併發

  • 聊天室通信:

客戶端A,客戶端B,客戶端N訂閱同一主題,進行消息發佈和接收。實現相似聊天室效果。以上實際是消息隊列的兩種消息模式,點對點或發佈訂閱模式。模型爲示意圖,供參考。less

2. JMS消息服務

消息隊列的JavaEE規範JMS。JMS(Java Message Service即Java消息服務) API是一個信息服務的標準/規範,容許應用程序組件基於JavaEE平臺建立、發送、接收和讀取消息。它使分佈式通訊耦合度更低,消息服務更加可靠以及異步性。異步

2.1 消息模型

在JMS標準中,有兩種消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。分佈式

2.2 P2P模式-隊列模式

P2P模式包含三個角色:消息隊列(Queue),發送者(Sender)、接收者(Receiver)。每一個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留着消息,知道他們被消費或超時。性能

  • P2P的特色
    • 每一個消息只能被一個消費者(Consumer)消費(即一旦被消費,信息就再也不存在於消息隊列中)
    • 發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息以後,無論接收者有沒有正在運行,它不會影響到消息被髮送到隊列
    • 接收者在成功接收到消息以後須要向隊列應答成功

若是但願發送的每一個消息都會被成功處理的話,那麼須要P2P模式。

2.3 Pub/Sub模式-廣播/主題模式

包含三個角色:主題(Topic)、發佈者(Publisher)、訂閱者(Subscriber)多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。

  • Pub/Sub的特色
    • 每一個消息能夠有多個消費者
    • 發佈者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須建立一個訂閱者以後,才能被消費發佈者的消息
    • 爲了消費消息,訂閱者必須保持運行的狀態

爲了緩和這樣嚴格的時間相關性,JMS容許訂閱者建立一個可持久化的訂閱。這樣,即便訂閱者沒有被激活(運行),它也能接收到發佈者的信息。

若是但願發送的消息能夠被多個消費者處理的話,那麼能夠採用Pub/Sub模式

  • 消息消費方式

在JMS中,消息的產生和消費都是異步的。對於消費來講,JMS的消費者能夠經過兩種方式來消費消息。

1)同步:
訂閱者或接收者經過receive方法來接收消息,receive在接收消息以前(或超時以前)將一直堵塞;
2)異步
訂閱者或消費者能夠註冊爲一個消息監聽器。當消息到達以後,系統自動調用監聽器的onMessage方法。
相關文章
相關標籤/搜索