一、為什么需要消息隊列
消息隊列的核心作用就是三點:解耦一個系統中各個子模塊的互相綁定與依賴,異步執行后台耗時邏輯,並行處理一個請求中涉及的多個操作。
以我們常見的下訂單場景來說明,我們熟悉的淘寶,后台運作着成千上百的子系統,一個簡單的加入購物車並下單的操作,后台要經過購物車存儲記錄,計費中心計算總值,訂單中心處理訂單,后轉交倉庫處理等等子系統的邏輯,如果每下單一件物品,都要等所有流程跑完,再返回下單成功的提示,那用戶體驗是極差的,因為在多個子系統的信息傳遞和處理會帶來時間上的巨大開銷。同時這樣的架構設計也是不合理的,各個子系統會存在互相依賴甚至循環依賴的情況,在子系統日益增多的場景下,這樣的一個龐大系統是難以維護的。
而我們現實的體驗是,每次一點擊下單,馬上就返回了訂單處理成功的提示。那是因為淘寶后台廣泛的使用了消息中間件,將訂單信息以消息的形式發送到MQ消息中間件。而后台所有子系統各自獨立運作,通過收發消息來並行的對訂單作存儲,計費,入庫,出庫操作,這樣極大的提高了系統的靈活性,減少用戶等待提示的時間,帶來了更好的用戶體驗。
二、JMS規范
JMS是什么:JMS是Java提供的一套技術規范和關於消息中間件的協議
JMS干什么用:通過生產者Producer,消息服務器,以及消費者通力合作,使異構系統能進行集成通信,緩解系統瓶頸,提高系統的伸縮性增強系統用戶體驗,使得系統模塊化和組件化變得可行並更加靈活,其中生產者,消息服務器,以及消費者的工作模型如下:
  
JMS的消息傳輸模型
  點對點模式(一對一,消費者主動拉取數據,消息收到后消息清除)
點對點模型通常是一個基於拉取或者輪詢的消息傳送模型,這種模型從隊列中請求信息,而不是將消息推送到客戶端。這個模型的特點是發送到隊列的消息被一個且只有一個接收者接收處理,即使有多個消息監聽者也是如此。
發布/訂閱模式(一對多,數據生產后,推送給所有訂閱者)
發布訂閱模型則是一個基於推送的消息傳送模型。發布訂閱模型可以有多種不同的訂閱者,臨時訂閱者只在主動監聽主題時才接收消息,而持久訂閱者則監聽主題的所有消息,即使當前訂閱者不可用,處於離線狀態。
  
三、Kafka介紹
Apache Kafka是一個開源消息系統,由Scala寫成。是由Apache軟件基金會開發的一個開源消息系統項目,目標是為處理實時數據提供一個統一、高通量、低等待的平台,Kafka被廣泛地應用於各種流式計算中。
Kafka提供了類JMS的特性,但在設計實現上並不遵循JMS規范,Kafka對消息保存時根據Topic進行歸類,發送消息者稱為Producer,消息接受者稱為Consumer,此外kafka集群有多個kafka實例組成,每個實例(server)稱為broker。同時無論是kafka集群,還是producer和consumer都依賴於zookeeper集群保存一些meta信息,來保證系統可用性。
Kafka核心組件及簡單的運作流程圖:
  Topic :消息根據Topic進行歸類
  Producer:發送消息者
  Consumer:消息接受者
  Kafka cluster:kafka集群
  broker:每個kafka實例(server)
  Zookeeper:依賴集群保存meta信息
  
