天天看點

Kafka實戰(1)-為何大廠都選擇Kafka作為消息隊列

這MQ有啥用?

MQ是一組規範。

利用這組規範可以在不同系統間傳遞語義準确的消息,實作松耦合的異步式資料傳遞。

系統A發送消息給MQ,系統B從MQ中讀取A發送的消息。

既然MQ是用于在不同系統間傳輸消息,那

如何設計待傳輸消息的格式?

一條消息如何才能做到資訊表達業務語義且無歧義,同時還能最大限度提供可重用性以及通用性?

使用成熟解決方案?比如CSV、XML、JSON、Google的Protocol Buffer、Facebook的Thrift。而Kafka使用純二進制位元組序列。當然還是結構化的消息,隻是在使用前都将其轉換成二進制位元組序列。

MQ還要設定具體傳輸協定

如何傳輸消息?

點對點模型

也稱消息隊列模型。系統A發送的消息隻能被系統B接收,其他任何系統都不能讀取A發送的消息。

比如電話客服:同一客戶呼入電話隻能被一位客服人員處理,其它客服人員不能為該客戶服務。

點對點模型裡一個消息隻會被一個消費者消費,和Java的線程池非常類似(Java線程池的任務也隻會被一個線程執行)

釋出/訂閱模型

新增主題(Topic)概念,即邏輯語義相近的消息容器。該模型的發送方也稱釋出者(Publisher),接收方為訂閱者(Subscriber)。

和點對點模型不同,該模型可能存在多個釋出者向相同的主題發消息,而訂閱者也可能存在多個,它們都能接收到相同主題的消息。

比如生活中的報紙訂閱就是一種釋出/訂閱模型。

釋出訂閱模型裡一個消息會被多個消費者消費,本質上是一種消息的廣播,在多線程程式設計領域,可以結合觀察者模式實作廣播功能。

而Kafka同時支援倆種消息引擎模型哦!

消息引擎系統 V.S JMS

JMS,Java Message Service,也同時支援兩種消息引擎模型。嚴格說它并非傳輸協定而僅僅是API。不過JMS太有名以至于很多主流消息引擎系統都支援JMS規範,比如RabbitMQ、Kafka。Kafka也未完全遵照JMS規範。

為什麼要使用MQ?

業務開發

為什麼系統A不直接發送消息給系統B,中間還非得隔個消息引擎?

為了削峰填谷:

即緩沖上下遊瞬時突發流量,使其更平滑。特别是對于那種發送能力很強的上遊系統,若無消息引擎保護,“脆弱”的下遊系統可能會直接被消息流量壓垮導緻服務雪崩。

有了消息引擎,就能夠有效對抗上遊流量沖擊,将上遊的“峰”填滿到“谷”,避免流量震蕩。

消息引擎系統的另一大好處在于發送方和接收方的松耦合,這也在一定程度上簡化應用開發,減少系統間很多不必要的互動。

Kafka具體又是怎麼“抗”峰值流量呢?

比如你在外需要開房預訂酒店,每家酒店都有專門預訂按鈕

Kafka實戰(1)-為何大廠都選擇Kafka作為消息隊列

點選之後進入到付費頁面。這簡單流程就包含多個子服務,比如點選預訂按鈕會調用訂單系統生成對應訂單,而處理該訂單會依次調用下遊的多個子系統服務 ,比如調用支付寶和微信支付的接口、查詢你的登入資訊、驗證酒店資訊等。上遊訂單操作比較簡單,其TPS遠高于處理訂單的下遊服務,是以上下遊系統直接對接,勢必會出現下遊服務無法及時處理上遊訂單進而造成訂單堆積。特别秒殺時,上遊訂單流量瞬時增加,可能直接壓跨下遊子系統服務。

對上遊系統限速?這種做法對上遊系統而言顯然不合理,畢竟問題并不出現在它。是以更常見的辦法是引入像Kafka這樣的消息引擎系統來對抗這種上下遊系統TPS的錯配以及瞬時峰值流量。

引入Kafka後。上遊訂單服務不再直接與下遊子服務互動。當新訂單生成後它僅僅是向Kafka Broker發一條訂單消息。下遊的各個子服務訂閱Kafka中的對應主題,并實時從該主題的各自分區(Partition)中擷取到訂單消息進行處理,進而實作上遊訂單服務與下遊訂單處理服務解耦。當秒殺時,Kafka能将瞬時增加的訂單流量全部以消息形式儲存在對應主題,既不影響上遊服務的TPS,同時也給下遊子服務留出了充足的時間去消費它們。這就是Kafka這類消息引擎系統的最大意義。

大資料

在大量使用分布式資料庫、分布式計算叢集時:

  • 分析使用者行為( pageviews ) ,以便設計廣告位
  • 對使用者的搜尋關鍵詞進行統計,分析流行趨勢
  • 有些資料,存資料庫浪費,直接存硬碟操作效率又低

這時就可用MQ。

MQ V.S RPC

廣義上屬于資料流模式(dataflow mode)差別。

常見資料流:

  1. 通過資料庫
  2. 通過服務調用(REST/RPC)
  3. 通過異步消息傳遞(消息引擎,如Kafka)

RPC和MQ相似,遠端調用一個服務也可看做是一個事件,但不同在于:

  • MQ有自己的buffer,能夠對抗過載(overloaded)和不可用場景
  • MQ支援重試
  • 允許釋出/訂閱模式

應該說RPC是介于通過DB和通過MQ之間的資料流模式。

參考

Apache Kafka實戰