kafka初認識(一)

首先貼出官網地址://kafka.apache.org/

一、 簡介

 

Kafka 是 linkedin 使用 Scala 編寫具有高水平擴展和高吞吐量的分佈式消息系統。Kafka 對消息保存時根據 Topic 進行歸類,發送消息者成為 Producer ,消息接受者成為 Consumer ,此外 kafka 集群有多個 kafka 實例組成,每個實例(server)稱為 broker。無論是 Kafka集群,還是 producer 和 consumer 都依賴於 zookeeper 來保證系統可用性,為集群保存一些 meta 信息。(但新版本除外,不用依賴zookeeper)

二、常用MQ性能對比

 

 

 三、kafa主要功能

Apache Kafka® 是 一個分佈式流處理平台

流處理平台特性

  • 可以讓你發佈和訂閱流式的記錄。這一方面與消息隊列或者企業消息系統類似。
  • 可以儲存流式的記錄,並且有較好的容錯性。
  • 可以在流式記錄產生時就進行處理。

Kafka 適合什麼樣的場景

  • 構造實時流數據管道,它可以在系統或應用之間可靠地獲取數據。 (相當於消息隊列)
  • 構建實時流式應用程序,對這些流數據進行轉換或者影響。

四、kafa相關概念

 

AMQP (Advanced Message Queuing Protocol) ,是一個提供統一消息服務的標準高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件而設計。

 

 

一些基本的概念:

AMQP服務器端(broker):用來接收生產者發送的消息並將這些消息路由給服務器中的隊列

消費者(Consumer):從消息隊列中請求消息的客戶端應用程序

生產者(Producer):向 broker 發佈消息的客戶端應用程序

Topics 和 Logs

Topic 就是數據主題,是數據記錄發佈的地方,可以用來區分業務系統。Kafka 中的 Topics 總是多訂閱者模式,一個 topic 可以擁有一個或者多個消費者來訂閱它的數據。對於每一個topic,Kafka集群都會維持一個分區日誌,如圖所示:

 

 

Partition

 

 

每一個分區都是一個順序的、不可變的消息隊列, 並且可以持續的添加。分區中的消息都被分了一個序列號,稱之為偏移量(offset),在每個分區中此偏移量都是唯一的。Kafka集群保持所有的消息,直到它們過期, 無論消息是否被消費了。 實際上消費者所持有的僅有的元數據就是這個偏移量,也就是消費者在這個log中的位置。 這個偏移量由消費者控制:正常情況當消費者消費消息的時候,偏移量也線性的的增加。但是實際偏移量由消費者控制,消費者可以將偏移量重置為更老的一個偏移量,重新讀取消息。 可以看到這種設計對消費者來說操作自如, 一個消費者的操作不會影響其它消費者對此log的處理。kafka 並沒有提供其他額外的索引機制來存儲 offset,因為在 kafka 中幾乎不允許對消息進行「隨機讀寫」。再說說分區。Kafka中採用分區的設計有幾個目的。一是可以處理更多的消息,不受單台服務器的限制。Topic擁有多個分區意味着它可以不受限的處理更多的數據。第二,分區可以作為並行處理的單元

Distribution

Log 的分區被分佈到集群中的多個服務器上,每個服務器處理它分到的分區, 根據配置每個分區還可以複製到其它服務器作為備份容錯。每個分區有一個 leader,零或多個 follower。Leader 處理此分區的所有的讀寫請求,而 follower 被動的複製數據。如果 leader 宕機,其它的一個 follower 會被推舉為新的 leader。 一台服務器可能同時是一個分區的 leader,另一個分區的 follower。 這樣可以平衡負載,避免所有的請求都只讓一台或者某幾台服務器處理。

Producers

生產者往某個Topic上發佈消息,生產者也負責選擇發佈到Topic上的哪一個分區。最簡單的方式從分區列表中輪流選擇,也可以根據某種算法依照權重選擇分區。開發者負責如何選擇分區的算法。

Consumers

消費者使用一個消費組名稱來進行標識,發佈到 topic 中的每條記錄被分配給訂閱消費組中的一個消費者實例。消費者實例可以分佈在多個進程中或者多個機器上。

如果所有的消費者實例在同一消費組中,消息記錄會負載平衡到每一個消費者實例。

如果所有的消費者實例在不同的消費組中,每條消息記錄會廣播到所有的消費者進程。

 

 

如圖,這個 Kafka 集群有兩台 server 的,四個分區(p0-p3)和兩個消費者組。消費組A有兩個消費者,消費組B有四個消費者。通常情況下,每個 topic 都會有一些消費組,一個消費組對應一個”邏輯訂閱者

“。一個消費組由許多消費者實例組成,便於擴展和容錯。這就是發佈和訂閱的概念,只不過訂閱者是一組消費者而不是單個的進程。Kafka中實現消費的方式是將日誌中的分區劃分到每一個消費者實例上,以便在任何時間,每個實例都是分區唯一的消費者。維護消費組中的消費關係由Kafka協議動態處理。如果新的實例加入組,他們將從組中其他成員處接管一些 partition 分區;如果一個實例消失,擁有的分區將被分發到剩餘的實例。Kafka 只保證分區內的記錄是有序的,而不保證主題中不同分區的順序。每個 partition 分區按照key值排序足以滿足大多數應用程序的需求。但如果你需要總記錄在所有記錄的上面,可使用僅有一個分區的主題來實現,這意味着每個消費者組只有一個消費者進程。

Replication

每個partition還會被複制到其它服務器作為replication,這是一種冗餘備份策略

  • 同一個partition的多個replication不允許在同一broker上
  • partition的replication中,有一個leader ,零或多個follower
  • leader處理此分區的所有的讀寫請求, follower僅僅被動的複製數據
  • leader宕機後,會從follower中選舉出新的leader

 

四個核心 API

  • Producer API:允許一個應用程序發佈一串流式的數據到一個或者多個 Kafka topic。
  • Consumer API:允許一個應用程序訂閱一個或多個 topic ,並且對發佈給他們的流式數據進行處理。
  • Streams API:允許一個應用程序作為一個流處理器,消費一個或者多個 topic 產生的輸入流,然後生產一個輸出流到一個或多個 topic 中去,在輸入輸出流中進行有效的轉換。
  • Connector API:允許構建並運行可重用的生產者或者消費者,將Kafka topics連接到已存在的應用程序或者數據系統。比如,連接到一個關係型數據庫,捕捉表(table)的所有變更內容。

 

 

Kafka中,客戶端和服務器之間的通信是通過簡單,高性能,語言無關的TCP協議完成的。此協議已版本化並保持與舊版本的向後兼容性。Kafka提供多種語言客戶端。

kafka API – producer 

 

 

Properties props = new Properties();
props.put("batch.size",16384);   //默認值為16384
props.put("linger.ms",16384);   //默認值為0
props.put("acks", "all");
props.put("retries",1);
//...

Producer<String, String> producer = new KafkaProducer(props);
ProducerRecord<String, String> record =new ProducerRecord<String, String>("my-topic", "key", "value");
producer.send(record);
producer.close();
  • Producer會為每個partition維護一個緩衝,用來記錄還沒有發送的數據,每個緩衝區大小用 batch.size指定,默認值為16k.
  • linger.ms為,buffer中的數據在達到batch.size前,需要等待的時間
  • acks用來配置請求成功的標準

 

kafka API – consumer

Kafka Simple Consumer 

Simple Cnsumer 位於kafka.javaapi.consumer包中,不提供負載均衡、容錯的特性每次獲取數據都要指定topic、partition、offset、fetchSize

High-level Consumer

該客戶端透明地處理kafka broker異常,透明地切換consumer的partition,通過和broker交互來實現consumer group級別的負載均衡。

 

 

如圖,這個 Kafka 集群有兩台 server 的,四個分區(p0-p3)和兩個消費者組。消費組A有兩個消費者,消費組B有四個消費者。通常情況下,每個 topic 都會有一些消費組,一個消費組對應一個”邏輯訂閱者”。一個消費組由許多消費者實例組成,便於擴展和容錯。這就是發佈和訂閱的概念,只不過訂閱者是一組消費者而不是單個的進程。Kafka中實現消費的方式是將日誌中的分區劃分到每一個消費者實例上,以便在任何時間,每個實例都是分區唯一的消費者。維護消費組中的消費關係由Kafka協議動態處理。如果新的實例加入組,他們將從組中其他成員處接管一些 partition 分區;如果一個實例消失,擁有的分區將被分發到剩餘的實例。Kafka 只保證分區內的記錄是有序的,而不保證主題中不同分區的順序。每個partition 分區按照key值排序足以滿足大多數應用程序的需求。但如果你需要總記錄在所有記錄的上面,可使用僅有一個分區的主題來實現,這意味着每個消費者組只有一個消費者進程。

五、kafa整體架構

 

Tags: