【Kafka】Kafka分佈式流式處理平臺

本博客文章如無特別說明,均爲原創!轉載請註明出處:Big data enthusiast(http://www.lubinsu.com/)

本文鏈接地址:【Kafka】Kafka分佈式流式處理平臺(http://www.lubinsu.com/index.php/archives/472)

作爲一個分佈式消息發佈訂閱系統,Kafka在大數據領域被人們所熟知,在這裏對Kafka的一些基本概念做一個簡介,後續將對Kafka做一整個專題的介紹。希望對大家有所幫助。

Kafka流平臺有如下三個特徵:

  • Publish and subscribe to streams of records, similar to a message queue or enterprise messaging system.

  • Store streams of records in a fault-tolerant durable way.

  • Process streams of records as they occur.

也就是說它類似於消息隊列或者企業級消息系統,可以發佈訂閱流中的數據、可以將接收到的數據持久化達到高容錯性的效果,你還可以通過這個平臺實時處理接收到的流式數據。

  • API

我們先來看下Kafka的四類主要的API:

  1. Producer API:發佈流數據到一個或者多個topic

  2. Consumer API:用於訂閱一個或者多個topic,並且處理產生的消息

  3. Streams API:作爲一個流處理器,有效的將一個輸入流轉換爲一個輸出流,也就是將一個或者多個topic的數據處理轉換成另一個或者多個topic的數據

  4. Connector API:我們可以通過connector api構建並運行一個可以重複使用的生產者或者消費者,來連接Kafka的topic與應用程序,或者數據系統

概念釋義

開頭說了這麼多,可能大家對一些新的概念還不是很熟悉,這裏我們來了解下幾個專有名詞:

  1. Topic(主題):Kafka集羣分類保存的一系列流數據,這些分類就叫做主題

A topic is a category or feed name to which records are published. Topics in Kafka are always multi-subscriber; that is, a topic can have zero, one, or many consumers that subscribe to the data written to it.

也就是說kafka中的topic支持一個或者多個消費者訂閱它。並且針對每個topic,Kafka維護了一個經過分區的log,如下圖所示:

在這裏,每個分區都是一個有序的、不可變的、不斷追加的日誌序列。並且每一條記錄在這裏都用一個順序生成的id標示了——叫做offset,這個offset唯一標誌了一個partition的一條記錄。不管這些消息有沒有被消費掉,Kafka集羣會根據所配置的時間段將每一條記錄持久化在磁盤中。只要消息在指定的時間內還未過期,我們都可以從中消費到它。

  1. 分佈式

所有日誌的分區,分佈在Kafka集羣的服務器上,每臺服務處理其所負責的partition的數據和請求,每個partition根據配置可以擁有多個副本並分佈到不同的服務器上,來達到容錯的效果。

每個partition擁有一個leader,並且有0個或者多個follower,leader負責所有的讀寫,follower負責被動的從leader複製。如果leader失敗了,那麼其中的follower將會自動轉爲leader。每臺服務器扮演了一部分topic的leader,一部分topic的follower,以此達到負載均衡的效果。

  1. Producer(生產者):Kafka的生產者根據指定的邏輯(如:round-robin),將消息分發到指定topic的partition下

  2. Consumer(消費者):Kafka的消費者根據group name來標識自己,每條發佈的消息最終會傳送給每個指定了group name的消費者,同一個消費者(只要group name相同)可以分佈在不同服務器的不同進程中

  • If all the consumer instances have the same consumer group, then the records will effectively be load balanced over the consumer instances.–同一個group name可以達到負載均衡的效果

  • If all the consumer instances have different consumer groups, then each record will be broadcast to all the consumer processes.–不同的group name,那麼記錄將會被拷貝多份分發給各個group

由此可見,我們可以通過創建多個同名的consumer,實現消費者的高可用和負載均衡。如果新的同名消費者實例加入進來,那麼它會從其他的同名消費者實例中接管該topic下的部分partition,如果某個實例down了,那麼它接管的partition則會被其他同名消費者接管。另外,Kafka的數據有序性只是在單個partition中有序,而在不同的patition之間的數據是無法保證消費的先後順序的。如果我們需要達到數據消費的有序性,那麼可以將partition的數量設置爲1,而這樣意味着這個topic下的每個group消費實例只能有一個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章