Kafka的設計思想 理念

2021-07-11 08:35:31 字數 2889 閱讀 8282

本節主要從整體角度介紹kafka的設計思想,其中的每個理念都可以深入研究,以後我可能會發專題文章做深入介紹,在這裡只做較概括的描述以便大家更好的理解kafka的獨特之處。本節主要涉及到如下主要內容:

一、kafka由來

由於對jms日常管理的過度開支和傳統jms可擴充套件性方面的侷限,linkedin(www.linkedin.com) 開發了kafka以滿足他們對實時資料流的監控以及對cpu、io利用率等指標的高要求。在linkedin開發kafka之初,把關注重點集中在了這幾個方面:

二、基本思想

乙個最基本的架構是生產者發布乙個訊息到kafka的乙個主題(topic),這個主題即是由扮演kafkaserver角色的broker提供,消費者訂閱這個主題,然後從中獲取訊息,下面這個圖可以更直觀的描述這個場景:

上圖所示的架構分為三部分:producers、kafka broker、consumers,它們分別執行在不同的節點。

下面概括介紹一下kafka一些設計思想:

consumer group: 各個consumer可以組成乙個組,每個訊息只能被組中的乙個consumer消費,如果乙個訊息可以被多個consumer消費的話,那麼這些consumer必須在不同的組。

訊息狀態: 在kafka中,訊息的狀態被儲存在consumer中,broker不會關心哪個訊息被消費了被誰消費了,只記錄乙個offset值(指向partition中下乙個要被消費的訊息位置),這就意味著如果consumer處理不好的話,broker上的乙個訊息可能會被消費多次。

訊息持久化: kafka中會把訊息持久化到本地檔案系統中,並且保持極高的效率。

訊息有效期: kafka會長久保留其中的訊息,以便consumer可以多次消費,當然其中很多細節是可配置的。

批量傳送: kafka支援以訊息集合為單位進行批量傳送,以提高push效率。

push-and-pull: kafka中的producer和consumer採用的是push-and-pull模式,即producer只管向broker push訊息,consumer只管從broker pull訊息,兩者對訊息的生產和消費是非同步的。

kafka集群中broker之間的關係: 不是主從關係,各個broker在集群中地位一樣,我們可以隨意的增加或刪除任何乙個broker節點。

負載均衡方面: kafka提供了乙個 metadata api來管理broker之間的負載(對kafka0.8.x而言,對於0.7.x主要靠zookeeper來實現負載均衡)。

同步非同步: producer採用非同步push方式,極大提高kafka系統的吞吐率(可以通過引數控制是採用同步還是非同步方式)。

分割槽機制partition: kafka的broker端支援訊息分割槽,producer可以決定把訊息發到哪個分割槽,在乙個分割槽中訊息的順序就是producer傳送訊息的順序,乙個主題中可以有多個分割槽,具體分割槽的數量是可配置的。分割槽的意義很重大,後面的內容會逐漸體現。

離線資料裝載: kafka由於對可拓展的資料持久化的支援,它也非常適合向hadoop或者資料倉儲中進行資料裝載。

外掛程式支援: 現在不少活躍的社群已經開發出不少外掛程式來拓展kafka的功能,如用來配合storm、hadoop、flume相關的外掛程式。

三、訊息壓縮

那麼如何區分訊息是壓縮的還是未壓縮的呢,kafka在訊息頭部新增了乙個 描述壓縮屬性位元組

,這個位元組的後兩位表示訊息的壓縮採用的編碼,如果後兩位為0,則表示訊息未被壓縮。

具體細節請參考:

四、訊息轉運過程中的可靠性

在訊息系統中,保證訊息在生產和消費過程中的可靠性是十分重要的,在實際訊息傳遞過程中,可能會出現如下三中情況:

乙個訊息傳送失敗

乙個訊息被傳送多次

最理想的情況:exactly-once ,乙個訊息傳送成功且僅傳送了一次                   

有許多系統聲稱它們實現了exactly-once,但是它們其實忽略了生產者或消費者在生產和消費過程中有可能失敗的情況。比如雖然乙個producer成功傳送乙個訊息,但是訊息在傳送途中丟失,或者成功傳送到broker,也被consumer成功取走,但是這個consumer在處理取過來的訊息時失敗了。

從producer端看:kafka是這麼處理的,當乙個訊息被傳送後,producer會等待broker成功接收到訊息的反饋(可通過引數控制等待時間),如果訊息在途中丟失或是其中乙個broker掛掉,producer會重新傳送(我們知道kafka有備份機制,可以通過引數控制是否等待所有備份節點都收到訊息)。

從consumer端看:前面講到過partition,broker端記錄了partition中的乙個offset值,這個值指向consumer下乙個即將消費message。當consumer收到了訊息,但卻在處理過程中掛掉,此時consumer可以通過這個offset值重新找到上乙個訊息再進行處理。consumer還有許可權控制這個offset值,對持久化到broker端的訊息做任意處理。

五、mirror乙個kafka集群

關於kafka集群的mirror,參考下面這幅圖:

具體細節請參考:

六、備份機制

備份機制是kafka0.8版本的新特性,備份機制的出現大大提高了kafka集群的可靠性、穩定性。有了備份機制後,kafka允許集群中的節點掛掉後而不影響整個集群工作。乙個備份數量為n的集群允許n-1個節點失敗。在所有備份節點中,有乙個節點作為lead節點,這個節點儲存了其它備份節點列表,並維持各個備份間的狀體同步。下面這幅**釋了kafka的備份機制:

具體細節請參考:

Python 哲學理念及設計思想

美麗優於醜陋。清楚優於含糊。簡單優於複雜。複雜優於繁瑣。平坦優於曲折。寬鬆優於密集。重要的是可讀性。特殊的案例不足以特殊到破壞規則。儘管實踐可以打破真理。錯誤卻不可置之不理。除非另有明確要求。面對模稜兩可,拒絕猜測。總會有乙個 最好是只有乙個 顯而易見的方式來明辨。哪怕這種方式在開始的時候可能並不明...

設計的理念

今天在閱讀 設計原本 的第一章的時候,看到乙個名詞 設計理念 的時候,十分驚喜。如果只是說設計本身的話,它可以看做是 乙個受造的事物 當設計作為動詞的時候,就是與這個事物相關的設計過程。這個看到這裡其實並沒有讓我感到很驚喜,但是當看到 設計理念 的時候,我覺得今晚的書沒有白看。設計理念是具備設計整體...

Windows UI的設計理念

windows ui的設計理念由最核心的五個原則組成,它們是 簡潔與快速 clean,light,open,fast 注重排版和布局 celebrate typography 內容重於形式 content before chrome 生動而有靈魂 alive in motion 返璞歸真 authe...