Kafka的基本概念

2021-08-26 09:07:56 字數 3532 閱讀 9583

舉個例子,生產者消費者,生產者生產雞蛋,消費者消費雞蛋,生產者生產乙個雞蛋,消費者就消費乙個雞蛋,假設消費者消費雞蛋的時候噎住了(系統宕機了),生產者還在生產雞蛋,那新生產的雞蛋就丟失了。再比如生產者很強勁(大交易量的情況),生產者1秒鐘生產100個雞蛋,消費者1秒鐘只能吃50個雞蛋,那要不了一會,消費者就吃不消了(訊息堵塞,最終導致系統超時),消費者拒絕再吃了,」雞蛋「又丟失了,這個時候我們放個籃子在它們中間,生產出來的雞蛋都放到籃子裡,消費者去籃子裡拿雞蛋,這樣雞蛋就不會丟失了,都在籃子裡,而這個籃子就是」kafka「。

雞蛋其實就是「資料流」,系統之間的互動都是通過「資料流」來傳輸的(就是tcp、http什麼的),也稱為報文,也叫「訊息」。

訊息佇列滿了,其實就是籃子滿了,」雞蛋「 放不下了,那趕緊多放幾個籃子,其實就是kafka的擴容。

各位現在知道kafka是幹什麼的了吧,它就是那個"籃子"。

(

kafka是乙個分布式的流平台,乙個流處理平台具有三個關鍵能力:發布和訂閱訊息(流),在這方面,它類似於乙個訊息佇列或企業訊息系統。

以容錯的方式儲存訊息(流)。

在訊息流發生時處理它們。

構建實時的流資料管道,可靠地獲取系統和應用程式之間的資料。

構建實時流的應用程式,對資料流進行轉換或反應。

kafka作為乙個集群執行在乙個或多個伺服器上。

kafka集群儲存的訊息是以topic為類別記錄的。

每個訊息(也叫記錄record,我習慣叫訊息)是由乙個key,乙個value和時間戳構成。

topic

kafka將訊息種子(feed)分門別類,每一類的訊息稱之為乙個主題(topic).

producer

發布訊息的物件稱之為主題生產者(kafka topic producer)

consumer

訂閱訊息並處理發布的訊息的種子的物件稱之為主題消費者(consumers)

broker

已發布的訊息儲存在一組伺服器中,稱之為kafka集群。集群中的每乙個伺服器都是乙個**(broker). 消費者可以訂閱乙個或多個主題(topic),並從broker拉資料,從而消費這些已發布的訊息。

kafka有四個核心api:

topic是發布的訊息的類別或者種子feed名。對於每乙個topic,kafka集群維護這乙個分割槽的log,就像下圖中的示例:

每乙個分割槽都是乙個順序的、不可變的訊息佇列, 並且可以持續的新增。分割槽中的訊息都被分了乙個序列號,稱之為偏移量(offset),在每個分割槽中此偏移量都是唯一的。

kafka集群保持所有的訊息,直到它們過期, 無論訊息是否被消費了。 實際上消費者所持有的僅有的元資料就是這個偏移量,也就是消費者在這個log中的位置。 這個偏移量由消費者控制:正常情況當消費者消費訊息的時候,偏移量也線性的的增加。但是實際偏移量由消費者控制,消費者可以將偏移量重置為更老的乙個偏移量,重新讀取訊息。 可以看到這種設計對消費者來說操作自如, 乙個消費者的操作不會影響其它消費者對此log的處理。 再說說分割槽。kafka中採用分割槽的設計有幾個目的。一是可以處理更多的訊息,不受單台伺服器的限制。topic擁有多個分割槽意味著它可以不受限的處理更多的資料。第二,分割槽可以作為並行處理的單元。

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

生產者(producers)

生產者往某個topic上發布訊息。生產者也負責選擇發布到topic上的哪乙個分割槽。最簡單的方式從分割槽列表中輪流選擇。也可以根據某種演算法依照權重選擇分割槽。開發者負責如何選擇分割槽的演算法。

消費者(consumers)

通常來講,訊息模型可以分為兩種, 佇列和發布-訂閱式。 佇列的處理方式是 一組消費者從伺服器讀取訊息,一條訊息只有其中的乙個消費者來處理。在發布-訂閱模型中,訊息被廣播給所有的消費者,接收到訊息的消費者都可以處理此訊息。kafka為這兩種模型提供了單一的消費者抽象模型: 消費者組 (consumer group)。 消費者用乙個消費者組名標記自己。 乙個發布在topic上訊息被分發給此消費者組中的乙個消費者。 假如所有的消費者都在乙個組中,那麼這就變成了queue模型。 假如所有的消費者都在不同的組中,那麼就完全變成了發布-訂閱模型。 更通用的, 我們可以建立一些消費者組作為邏輯上的訂閱者。每個組包含數目不等的消費者, 乙個組內多個消費者可以用來擴充套件效能和容錯。正如下圖所示:

2個kafka集群託管4個分割槽(p0-p3),2個消費者組,消費組a有2個消費者例項,消費組b有4個。

正像傳統的訊息系統一樣,kafka保證訊息的順序不變。 再詳細扯幾句。傳統的佇列模型保持訊息,並且保證它們的先後順序不變。但是, 儘管伺服器保證了訊息的順序,訊息還是非同步的傳送給各個消費者,消費者收到訊息的先後順序不能保證了。這也意味著並行消費將不能保證訊息的先後順序。用過傳統的訊息系統的同學肯定清楚,訊息的順序處理很讓人頭痛。如果只讓乙個消費者處理訊息,又違背了並行處理的初衷。 在這一點上kafka做的更好,儘管並沒有完全解決上述問題。 kafka採用了一種分而治之的策略:分割槽。 因為topic分割槽中訊息只能由消費者組中的唯一乙個消費者處理,所以訊息肯定是按照先後順序進行處理的。但是它也僅僅是保證topic的乙個分割槽順序處理,不能保證跨分割槽的訊息先後處理順序。 所以,如果你想要順序的處理topic的所有訊息,那就只提供乙個分割槽。

kafka中消費者組有兩個概念:佇列:消費者組(consumer group)允許同名的消費者組成員瓜分處理。發布訂閱:允許你廣播訊息給多個消費者組(不同名)。

kafka的每個topic都具有這兩種模式。

kafka有比傳統的訊息系統更強的順序保證。

傳統的訊息系統按順序儲存資料,如果多個消費者從佇列消費,則伺服器按儲存的順序傳送訊息,但是,儘管伺服器按順序傳送,訊息非同步傳遞到消費者,因此訊息可能亂序到達消費者。這意味著訊息存在並行消費的情況,順序就無法保證。訊息系統常常通過僅設1個消費者來解決這個問題,但是這意味著沒用到並行處理。

kafka做的更好。通過並行topic的parition —— kafka提供了順序保證和負載均衡。每個partition僅由同乙個消費者組中的乙個消費者消費到。並確保消費者是該partition的唯一消費者,並按順序消費資料。每個topic有多個分割槽,則需要對多個消費者做負載均衡,但請注意,相同的消費者組中不能有比分區更多的消費者,否則多出的消費者一直處於空等待,不會收到訊息。

僅僅讀,寫和儲存是不夠的,kafka的目標是實時的流處理。

可以直接使用producer和consumer api進行簡單的處理。對於複雜的轉換,kafka提供了更強大的streams api。可構建聚合計算或連線流到一起的複雜應用程式。

助於解決此類應用面臨的硬性問題:處理無序的資料,**更改的再處理,執行狀態計算等。

sterams api在kafka中的核心:使用producer和consumer api作為輸入,利用kafka做狀態儲存,使用相同的組機制在stream處理器例項之間進行容錯保障。

kafka基本概念

kafka 1 是一種高吞吐量 2 的分布式發布訂閱訊息系統,有如下特性 kafka基本概念 消費模式 1 分割槽消費模式 vs 組消費模式 分割槽的日誌被分發到集群內的伺服器上,每台伺服器負責處理一些分割槽和對這些分割槽的讀寫請求。為滿足容錯需求,各分割槽的資料都按乙個可配置的量被複製到集群的其他...

kafka基本概念

1.topics 主題 屬於特定類別的訊息流成為主題。資料儲存在topics中,topics被拆分為分割槽。對於每個主題,kafka儲存乙個分割槽的資料 每個這樣的分割槽包含不可變有序序列的訊息。分割槽被實現為具有相等大小的一組分段檔案。2.partition 分割槽 主題可能有許多分割槽,因此它可...

kafka 基本概念

訊息 訊息相當於資料庫中的記錄,kafka中的的訊息是二進位制訊息流,所以kafka中的訊息沒有特別的格式或者含義 批次 訊息可以分批次的被傳送,這樣可以提高效率,單條訊息穿梭於網路間,會導致大量的網路開銷,批次越大單位時間內處理的訊息就越多,單個訊息的傳輸時間就越長,批次訊息會被壓縮 可以提公升效...