Kafka 工作流程及名詞解釋

十年河東,十年河西,莫欺少年窮

學無止境,精益求精

MQ的作用

 1.解耦:將數據生產方和數據消費方解耦。數據生產方Pruducer只需要關心數據生產;數據消費放Consumer只需要關心數據消費。而不必關心其中的傳輸過程,該過程交給MQ保證。

    試想,Producer生產出數據後使用Http請求將數據發送Consumer,如果發送失敗,那麼是生產方的責任還是消費方的責任?如果生產方保證消息發送失敗的重試機制,那麼相當於

    將不屬於數據生產的邏輯加入了Producer。

 2.削峯:當Producer(不一定是內部系統,可能是外部系統,例如開放給外部的http接口,接口訪問量暴增)生產的數據量突然暴增,Consumer的吞吐量無法滿足數據量的升高。因此,

  必然會導致數據的堆積,慢慢會壓垮整個系統。因此,需要引入MQ對Producer生產的數據進行排隊,Consumer無法及時消費掉的數據會堆積在MQ中,而不至於直接壓垮Consumer。

 3.異步:Consumer和Producer之間可能吞吐量存在不同。因此,數據的生產和消費可以不同步。引入MQ可以使得數據生產和消費的流程異步化。

工作流程

鄙人簡單畫了張圖,如下:

上圖所示爲kafka的簡易工作流程 ,圖中展示了3個服務器的集羣,分別爲broker1、broker2、broker3。broker又被稱之爲服務器接點,每個Broker中可以有多個Topic對應的分區,每個分區對應一個分區副本,分區副本用於接點故障時,數據恢復。

例如:Broker1接點故障,Topic1分區1不能訪問,那麼kafka會使用Borker3中的Topic1分區1副本,這樣的設計就實現了kafka的高可用。

秒殺系統中,同一時刻上千萬人同時搶購一個商品,那麼久造成了生產者的生產速度大於消費速度,因此kafka提出了消費者組的概念,每個消費者組消費一個指定的分區,分區中同一個消息只能被消費者組的某個消費者消費,不能重複消費。

注意:如果有1個分區,那麼消費者消費時,消息時是有序的,如果有多個分區,那麼,消費時整體是無序的,但是同一個分區的數據是有序的

名詞解釋:

Broker

Broker 是指服務器,在kafka中broker也被稱之爲服務器接點,用於完成kafka集羣

Producer 【生產者】

Producer 生產者,生產者生產的數據被稱爲Mesage,也就是消息,他會經過攔截器,序列化器,分區器處理後,進入到某個Broker中的分區

Consumer 【消費者】

Consumer 數據消費者,從Kafka集羣拉取數據進行消費。

Consumer Group 【消費者組】

Consumer Group 消費組,Kafka保證在整個集羣穩定運行的情況下(不發生Reblance),每個Partition中的數據只會被一個Consumer Group消費,某一個消息只能被消費者組中的一個消費者消費,可爲每個 Consumer 指定 group name,若不指定 group name 則屬於默認的 group。

topic 【主題】

Topic 是一個邏輯概念,Partition 是最小的存儲單元,掌握着一個 Topic 的部分數據或全部數據。有且只有1個分區時,分區內數據就是Topic的數據。

Partition 【分區】

Partition 是分區,可以將分區理解爲一個隊列或一個有序集合,用於存放生產者生產的消息,它存儲在Broker接點中,一個Borker接點中可以存放多個Topic的分區和分區副本。

上圖中,Broker1中存放了Topic1分區1和Topic1分區3副本,那麼當Borker3宕機後,kafka會調用Broker1服務器的Topic1分區3副本,這樣就使得kafka高可用。

分區副本可以理解爲某個分區的數據備份。

那麼,消息會被分發到哪個分區呢?

有4種模式

1、程序員指定某個分區,這是優先級最高的模式

2、程序員指定一個PartitionKey,kafka會以PartitionKey進行Hash運算,計算結果決定寫入哪個 Partition,所以,有相同 Partition Key 的消息,會被放到相同的 Partition。

3、由kafka決定,如果既沒有指定分區,有沒有給一個PartitionKey,那麼kafka會通過輪詢的方式將消息存儲到分區。

4、Kafka 支持自定義規則,一個 Producer 可以使用自己的分區指定規則。

Parittion Replication 【分區副本】

由於每個Topic被劃分成1個或多個Partition,因此一個Topic的數據被劃分成多份分別存儲在不同Kafka Broker上,如果某個Broker出現故障,會導致存儲在該Broker的這部分數據丟失。

因此,Kafka提出了Replication概念。每個Topic可以設置1個或多個Replication,對Partition的數據進行冗餘備份。

若Replication數量被設爲3,則代表每個Parititon的數據在Kafka集羣中存在3份;如果Replication數量被設爲1,則代表每個Parititon的數據在Kafka集羣中只存在一份。

Partition Leader

Partition Leader 由於Replication的存在,因此每個Partittion的數據存在於多個Broker結點,因此,需要選出Parittion Leader。

Producer和Consumer對Parititon的數據的讀、寫只和Paritition Leader交互 

Offsets(偏移量)

Partition 中的每條記錄都會被分配一個唯一的序號,稱爲 Offset(偏移量)。

Offset 是一個遞增的、不可變的數字,由 Kafka 自動維護。

當一條記錄寫入 Partition 的時候,它就被追加到 log 文件的末尾,並被分配一個序號,作爲 Offset。

消息的順序性需要注意,一個 Topic 如果有多個 Partition 的話,那麼從 Topic 這個層面來看,消息是無序的。

但單獨看 Partition 的話,Partition 內部消息是有序的。

所以,一個 Partition 內部消息有序,一個 Topic 跨 Partition 是無序的。

如果強制要求 Topic 整體有序,就只能讓 Topic 只有一個 Partition。

@天才臥龍的博客

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章