Kafka在專案實踐中的若干經驗分享
Kafka是一個分散式訊息佇列,它將資料分割槽儲存,並將每個分割槽儲存成多份以提高資料可靠性。Kafka是在大資料背景下產生的,用以應對海量資料的處理場景,具有高效能、良好的擴充套件性、資料永續性等特點。
Kafka架構由生產者、代理和消費者三類元件構成。生產者將資料推送給代理,消費者從代理商拉取資料進行處理,而代理通過ZooKeeper進行協調和管理。生產者和消費者可根據業務需要自定義開發,多個代理構成一個可靠的分散式訊息儲存系統,避免資料丟失。代理中的訊息被劃分成若干個主題,同屬於一個主題的的所有資料被分成多個分割槽,以實現負載分攤和資料並行處理。Kafka基本架構如下:

kafka架構
Kafka在專案實踐中的若干經驗分享如下:
分享一:代理
啟動Kafka的一個例項就是一個代理,預設埠9092。通過ZooKeeper搭建Kafka叢集可以啟動多個代理同時對外提供服務,代理不儲存任何生產者和消費者狀態資訊。 在實際應用中,建議:每個代理分佈在不同的物理機器上。
分享二:主題
主題是儲存在kafka中的相同型別的資料集合名稱描述,主題包含一個或多個分割槽。假設kafka運行了3個代理,某個主題劃分了3個分割槽,那麼在代理1上,存在分割槽1(主),分割槽2(副)、分割槽3(副),在代理2上,存在分割槽1(副)、分割槽2(主)、分割槽3(副),在代理3上,存在分割槽1(副)、分割槽2(副)、分割槽3(主)。其中,主分割槽負責讀和寫操作,副本負責從主分割槽同步資料,當主分割槽所在代理出現異常時,通過選舉機制重新從其它代理機器上選擇主分割槽。如下圖所示:

主題分割槽
在實際應用中,建議:分割槽的數量不要大於代理伺服器的個數,分割槽數量大於代理個數,會造成同一個代理上出現多個主分割槽,一旦代理宕機影響較大。
分享三:分割槽
一個主題可以分成多個分割槽,相當於把一個數據集合分成多份分別放到不同的分割槽中儲存。 在實際應用中, 建議:我們知道每個分割槽都會分為主分割槽和副本,為了保障系統的高吞吐率,多個主分割槽一般會分佈在不同代理上。
分享四:生產者
使用Kafka提供的二次開發包開發的,生產者將資料轉化成訊息,並通過網路傳送個代理。 在實際應用中, 建議:kafka生產者採用支援叢集技術的框架開發和管理,例如Flume。
分享五:消費者
消費者從Kafka主題中拉取訊息,如果一個主題有多個分割槽,Kafka智慧保證一個分割槽內訊息的有序性,在不同的分割槽之間無法保證。 在實際應用中, 注意:對於時序資料而言,如果將某個主題下的資料分成了多個分割槽,可能會造成讀取資料的無序。
分享六:消費者組
消費者組是消費者的集合。消費者組內的消費者,對於訊息的消費是不會重複的,即同一條訊息,只會被其中一個消費者消費,不會被消費者組內兩個消費者消費。不同消費者組之間訊息消費是重複的。假設消費者組1有兩個消費者,那麼消費者1負責分割槽1和分割槽2中的訊息,消費者2負責消費分割槽3中的訊息,二者訊息的消費是不會重複的。如下圖所示:

訊息消費
結束語:Kafka是開源的分散式訊息佇列,能夠輕鬆實現高吞吐、可擴充套件、高可用,並且部署簡單快速、開發介面豐富。目前已經有很多分散式處理系統支援使用Kafka,例如Spark、Storm、Flume等。