一、簡介
Kafka是Apache旗下的一款分布式流媒體平台,Kafka是一種高吞吐量、持久性、分布式的發布訂閱的消息隊列系統。它最初由LinkedIn(領英)公司發布,使用Scala語言編寫,與2010年12月份開源,成為Apache的頂級子項目。主要用於處理消費者規模網站中的所有動作流數據。動作指(網頁瀏覽、搜索和其它用戶行動所產生的數據)。
Kafka是一個分布式消息隊列。Kafka對消息保存時根據Topic進行歸類,發送消息者稱為Producer,消息接受者稱為Consumer,此外kafka集群有多個kafka實例組成,每個實例(server)稱為broker。無論是kafka集群,還是consumer都依賴於zookeeper集群保存一些meta信息,來保證系統可用性。
二、其他消息系統對比
- RabbitMQ Erlang編寫,支持多協議 AMQP,XMPP,SMTP,STOMP。支持負載均衡、數據持久化。同時 支持Peer-to-Peer和發布/訂閱模式
- Redis 基於Key-Value對的NoSQL數據庫,同時支持MQ功能,可做輕量級隊列服務使用。就入隊操作而言, Redis對短消息(小於10KB)的性能比RabbitMQ好,長消息的性能比RabbitMQ差。
- ZeroMQ 輕量級,不需要單獨的消息服務器或中間件,應用程序本身扮演該角色,Peer-to-Peer。它實質上是 一個庫,需要開發人員自己組合多種技術,使用復雜度高
- ActiveMQ JMS實現,Peer-to-Peer,支持持久化、XA事務
- Kafka/Jafka 高性能跨語言的分布式發布/訂閱消息系統,數據持久化,全分布式,同時支持在線和離線處理。適合數據下游消費眾多的情況;適合數據安全性要求較高的操作,支持replication。為什么適合數據下游消費眾多?因為有就算有多個消費者,kafka里面存的數據是一樣的,不會再增加副本。
- MetaQ/RocketMQ 純Java實現,發布/訂閱消息系統,支持本地事務和XA分布式事務
三、Kafka組件
1.Kafka的三大特點
- 1.高吞吐量:可以滿足每秒百萬級別消息的生產和消費。
- 2.持久性:有一套完善的消息存儲機制,確保數據高效安全且持久化。
- 3.分布式:基於分布式的擴展;Kafka的數據都會復制到幾台服務器上,當某台故障失效時,生產者和消費者轉而使用其它的Kafka。
2.流媒體平台有三個關鍵功能:
- 1.發布和訂閱記錄流,類似於消息隊列或企業消息傳遞系統。
- 2.以容錯的持久方式存儲記錄流。
- 3.記錄發生時處理數據流
3.Kafka通常用於兩大類應用:
- 1.構建可在系統或應用程序之間可靠獲取數據的實時流數據管道
- 2.構建轉換或響應數據流的實時流應用程序
4.Kafka的幾個概念
- 1.Kafka作為一個集群運行在一個或多個服務器上,這些服務器可以跨多個機房,所以說kafka是分布式的發布訂閱消息隊列系統。
- 2.Kafka集群將記錄流存儲在稱為Topic的類別中。
- 3.每條記錄由鍵值;"key value"和一個時間戳組成。
5.Kafka的四個核心API:

- 1. Producer API:生產者API允許應用程序將一組記錄發布到一個或多個Kafka Topic中。
- 2. Consumer AIP:消費者API允許應用程序訂閱一個或多個Topic,並處理向他們傳輸的記錄流。
- 3. Streams API:流API允許應用程序充當流處理器,從一個或者多個Topic中消費輸入流,並將輸出流生成為一個或多個輸出主題,從而將輸入流有效地轉換為輸出流。
- 4. Connector API:連接器API允許構建和運行可重用的生產者或消費者,這些生產者或消費者將Kafka Topic連接到現有的應用程序或數據系統。例如:連接到關系數據庫的連接器可能會捕獲對表的每次更改。
四、Kafka架構圖

1、結構名詞解釋
消息由producer產生,消息按照topic歸類,並發送到broker中,broker中保存了一個或多個topic的消息,consumer通過訂閱一組topic的消息,通過持續的poll操作從broker獲取消息,並進行后續的消息處理。
Producer :消息生產者,就是向broker發指定topic消息的客戶端。
Consumer :消息消費者,通過訂閱一組topic的消息,從broker讀取消息的客戶端。
Broker :一個kafka集群包含一個或多個服務器,一台kafka服務器就是一個broker,用於保存producer發送的消息。一個broker可以容納多個topic。
Topic :每條發送到broker的消息都有一個類別,可以理解為一個隊列或者數據庫的一張表。
Partition:一個topic的消息由多個partition隊列存儲的,一個partition隊列在kafka上稱為一個分區。每個partition是一個有序的隊列,多個partition間則是無序的。partition中的每條消息都會被分配一個有序的id(offset)。
Offset:偏移量。kafka為每條在分區的消息保存一個偏移量offset,這也是消費者在分區的位置。kafka的存儲文件都是按照offset.kafka來命名,位於2049位置的即為2048.kafka的文件。比如一個偏移量是5的消費者,表示已經消費了從0-4偏移量的消息,下一個要消費的消息的偏移量是5。
Consumer Group (CG):若干個Consumer組成的集合。這是kafka用來實現一個topic消息的廣播(發給所有的consumer)和單播(發給任意一個consumer)的手段。一個topic可以有多個CG。topic的消息會復制(不是真的復制,是概念上的)到所有的CG,但每個CG只會把消息發給該CG中的一個consumer。如果需要實現廣播,只要每個consumer有一個獨立的CG就可以了。要實現單播只要所有的consumer在同一個CG。用CG還可以將consumer進行自由的分組而不需要多次發送消息到不同的topic。
假如一個消費者組有兩個消費者,訂閱了一個具有4個分區的topic的消息,那么這個消費者組的每一個消費者都會消費兩個分區的消息。消費者組的成員是動態維護的,如果新增或者減少了消費者組中的消費者,那么每個消費者消費的分區的消息也會動態變化。比如原來一個消費者組有兩個消費者,其中一個消費者因為故障而不能繼續消費消息了,那么剩下一個消費者將會消費全部4個分區的消息。
2、內部結構
- 消費者和生產者能操作的最小單元是分區,也就是不可能只消費一條數據
- 消費者組是邏輯概念,只是一個標記而已,具體的修改在config的server.properties中的設置int類型的broker_id
- 同一個消費者組里面不能是同時消費者消費消息,只能有一個消費者去消費,第二,同一個消費者組里面是不會重復消費消息的,第三,同一個消費者組的一個消費者不是以一條一條數據為單元的,是以分區為單元,就相當於消費者和分區建立某種socket,進行傳輸數據,所以,一旦建立這個關系,這個分區的內容只能是由這個消費者消費。
- Zookeeper保存kafka的集群狀態信息的,包括每個broker,為什么?,因為zk和broker建立監聽,一旦有一個broker宕機了,另一個備份就可以變為領導,第二,zk保存消費者的消費信息,為什么要保存?就是為了消費者下一次再次消費可以得知offset這個偏移量,consumer信息高版本在本地維護
- 為什么說kafka是分布式模型呢?首先,同一個kafka集群有共同擁有一個topic, 而同一個topic又擁有不同的分區,不同的分區可以分布在不同的borker上也就是不同的機子上,所以,分區是分布式的,則數據也是分布式的,kafka就是分布式
- 在不加上leader和fllower的概念的前提下,kafka的同一個topic里的分區號是不同,一定不能重復。
- 除了分區是分布式的,還有消費者也是分布式的,比如,消費者組里的消費者可以在不同的機器上,有什么好處?消費的方式可以是存儲可以是計算,如果是放在一台機子上,Io等壓力很大,
- kafka上面的所有想到的角色都是分布式的,不管是消費者還是生產者還是分區,他們之間溝通的唯一橋梁就是zookeeper
- 強調:kafka分區內有序,整體不一定有序。
- 消費者組的概念很重要,下圖解釋和同一組和不同組的使用情景

怎么實現消費者消費不同的數據? 將消費者放在同一組,但是生產環境一般要求消費者消費的數據一樣且多個,比如一個寫到hdfs,一個放到spark計算,這樣就得要求不同的消費者在不同的消費者組里。
簡單的說就是隊列里面的數據,如果想讓不同的消費者讀不同的數據,就把他們放在同一個組里,否則放在不同組。
參考:http://www.yunweipai.com/34283.html
https://blog.csdn.net/student__software/article/details/81486431
