Kafka快速入門祕籍:背景介紹,應用場景分析、核心架構分析

通信 物理 技術 極客慧 2018-12-16

一、背景介紹

引言:其實這段背景,我們之前介紹RabbitMQ的時候,已經說過了,我們這裡講kakfa的時候,再把這一段給拿出來,再說明下。在講實戰前,我們還是有必要講解下理論的,理論為輔,實戰為主,在實戰的基礎上,再深入理解理論,底層原理,底層源碼。下篇文章或者視頻,我們將帶你看官網學習kafka環境搭建、kafka基本用法、kafka的容錯性測試,在掌握知識的同時,還能順便學習下英文。

1)問題引入:

假設我們現在需要設計這樣一個用戶註冊系統:用戶註冊完成後,需要給用戶發送激活郵件,開通用戶賬號,記錄用戶IP、用戶設備、時間等信息。

起初的設計:

Kafka快速入門祕籍:背景介紹,應用場景分析、核心架構分析

2)但存在的問題是

由於多個系統強耦合在一起,用戶註冊響應會非常慢,嚴重影響了用戶的體驗,當流量大的時候,性能會更差。

3)引入消息中間件:

為了解決上述問題,我們引入消息中間件,來實現系統的解耦,多個系統間通過消息中間件進行異步通信,最終的設計圖如下:

Kafka快速入門祕籍:背景介紹,應用場景分析、核心架構分析

即實現了系統解耦,又提升了系統響應的速度

4)消息中間件介紹:

消息中間件(Message Queue Middleware,簡稱MQ)又稱為消息隊列,是指利用高效可靠的消息傳遞機制進行與平臺無關的數據交流,並基於數據通信來進行分佈式系統的構建。

Kafka快速入門祕籍:背景介紹,應用場景分析、核心架構分析

2、應用場景分析

1)異步通信

在很多時候,為了加快應用系統整體運轉速度,並不需要立即響應某些請求,消息中間件提供了異步處理機制,允許將一些請求信息放入消息中間件中,但並不立即處理它,而是慢慢處理。在有限資源下,使用消息中間件能夠使系統性能從容倍增!

如:用戶註冊成功的郵件通知;用戶購物下單的信息通知;大數據日誌收集處理

2)削峰

以防突發劇增流量瞬間沖垮系統,使用消息中間件可以支撐突發訪問壓力

3)業務系統解耦

系統間的耦合關係太強,會對系統的設計產生束縛,也會增加系統的複雜性,通過消息中間件可以更好的設計系統,是一個系統完成指定的功能,而不是將所有的功能融合在同一個系統中。

二、kafka簡介

Kafka作為一種消息中間件,是一種分佈式的,基於發佈/訂閱的消息系統。主要設計目標如下:

  • 以時間複雜度為O(1)的方式提供消息持久化能力,即使對TB級以上數據也能保證常數時間的訪問性能
  • 高吞吐率。即使在非常廉價的商用機器上也能做到單機支持每秒100K條消息的傳輸
  • 支持Kafka Server間的消息分區,及分佈式消費,同時保證每個partition內的消息順序傳輸
  • 同時支持離線數據處理和實時數據處理

1、kafka架構

Kafka快速入門祕籍:背景介紹,應用場景分析、核心架構分析

名詞解釋:

  • Broker
  • 一個Kafka集群由一個或多個broker組成。搭建了kafka環境的服務器就可以稱為broker。
  • Topic
  • Kafka集群上存儲的消息都有一個類別,這個類別被稱為topic。(使用者只需指定消息的topic,即可生產或消費數據而不必關心數據存於何處)Topic在邏輯上可以被認為是一個queue。每條消費都必須指定它的topic,可以簡單理解為必須指明把這條消息放進哪個queue裡,這與RabbitMQ就有點類似了。
  • Partition
  • 為了使得Kafka的吞吐率可以水平擴展,物理上又把topic分成一個或多個partition,每個partition在物理上對應一個文件夾,該文件夾下存儲這個partition的所有消息和索引文件。創建topic時可指定parition數量。我們實戰演示的時候,會再次說明。
Kafka快速入門祕籍:背景介紹,應用場景分析、核心架構分析

因為每條消息都被append到該partition中,是順序寫磁盤,因此效率非常高(經驗證,順序寫磁盤效率比隨機寫內存還要高,這是Kafka高吞吐率的一個很重要的保證)。

  • Producer
  • 負責發佈消息到Kafka broker
  • Consumer
  • 消費消息。每個consumer屬於一個特定的consumer group(可為每個consumer指定group name,若不指定group name則屬於默認的group)。同一topic的一條消息只能被同一個consumer group內的一個consumer消費,但多個consumer group可同時消費這一消息。

三、kafka其它核心概念

1、消息存儲

很多傳統的message queue都會在消息被消費完後將消息刪除,一方面避免重複消費,另一方面可以保證queue的長度比較少,提高效率。而Kafka集群會保留所有的消息,無論其被消費與否。當然,因為磁盤限制,不可能永久保留所有數據(實際上也沒必要),因此Kafka提供兩種策略去刪除舊數據。一是基於時間,二是基於partition文件大小。例如可以通過配置$KAFKA_HOME/config/server.properties,讓Kafka刪除一週前的數據,也可通過配置讓Kafka在partition文件超過1GB時刪除舊數據。

2、Consumer Group

每一個consumer實例都屬於一個consumer group,每一條消息只會被同一個consumer group裡的一個consumer實例消費。(不同consumer group可以同時消費同一條消息)

Kafka保證的是穩定狀態下每一個consumer實例只會消費某一個或多個特定partition的數據,而某個partition的數據只會被某一個特定的consumer實例所消費。這樣設計的劣勢是無法讓同一個consumer group裡的consumer均勻消費數據,優勢是每個consumer不用都跟大量的broker通信,減少通信開銷,同時也降低了分配難度,實現也更簡單。另外,因為同一個partition裡的數據是有序的,這種設計可以保證每個partition裡的數據也是有序被消費。

3、Consumer Rebalance

Kafka通過Zookeeper管理集群配置,在consumer group發生變化時(如:某個consumer因故障下線時)進行rebalance。具體含義為:

  • 如果某consumer group中consumer數量少於partition數量,則至少有一個consumer會消費多個partition的數據,
  • 如果consumer的數量與partition數量相同,則正好一個consumer消費一個partition的數據,
  • 而如果consumer的數量多於partition的數量時,會有部分consumer無法消費該topic下任何一條消息。

下篇文章,就是實戰為主了:帶你閱讀官網完成基本使用、容錯性測試

相關推薦

推薦中...