1、消費方式
consumer 采用 pull(拉) 模式從 broker 中讀取數據。
push(推)模式很難適應消費速率不同的消費者,因為消息發送速率是由 broker 決定的。
它的目標是盡可能以最快速度傳遞消息,但是這樣很容易造成 consumer 來不及處理消息,尚硅谷大數據技術之 Kafka典型的表現就是拒絕服務以及網絡擁塞。而 pull 模式則可以根據 consumer 的消費能力以適當的速率消費消息。
pull 模式不足之處是,如果 kafka 沒有數據,消費者可能會陷入循環中, 一直返回空數據。 針對這一點, Kafka 的消費者在消費數據時會傳入一個時長參數 timeout,如果當前沒有數據可供消費, consumer 會等待一段時間之后再返回,這段時長即為 timeout。
2、分區分配策略
一個 consumer group 中有多個 consumer,一個 topic 有多個 partition,所以必然會涉及 到 partition 的分配問題,即確定那個 partition 由哪個 consumer 來消費。
Kafka 有兩種分配策略,一是 RoundRobin,一是 Range。
RoundRobin :
RoundRobin 輪詢分區策略,是把所有的 partition 和所有的 consumer 都列出來,然后按照 hascode 進行排序,最后通過輪詢算法來分配 partition 給到各個消費者。
Range:
Range 范圍分區策略是對每個 topic 而言的。首先對同一個 topic 里面的分區按照序號進行排序,並對消費者按照字母順序進行排序。假如現在有 10 個分區,3 個消費者,排序后的分區將會是0,1,2,3,4,5,6,7,8,9;消費者排序完之后將會是C1-0,C2-0,C3-0。通過 partitions數/consumer數 來決定每個消費者應該消費幾個分區。如果除不盡,那么前面幾個消費者將會多消費 1 個分區。
圖是消費者C1、C2和topicA和B,
RoundRobin :已消費組為單位消費的,所有分片組合排序,然后輪詢
一下是消費者消費的分片
組1消費者A:A0,B1,B2
組1消費者B:A1,B0
組2消費者C:A2
或者
組1消費者A:A0,A1
組1消費者B:B0,B1,B2
組2消費者C:A2
所有會出現,同一個消費者取到的可能出現是同一個分片的數據,導致分發數據不均勻
Range:按照主題去平均分
組1消費者A:A0,A1
組1消費者B:B0,B1,B2,A2
組2消費者C:A0、A1、A2
3 offset 的維護
由於 consumer 在消費過程中可能會出現斷電宕機等故障,consumer 恢復后,需要從故 障前的位置的繼續消費,所以 consumer 需要實時記錄自己消費到了哪個 offset,以便故障恢 復后繼續消費。
Kafka 0.9 版本之前,consumer 默認將 offset 保存在 Zookeeper 中,從 0.9 版本開始, consumer 默認將 offset 保存在 Kafka 一個內置的 topic 中,該 topic 為__consumer_offsets。
4、Zookeeper 在 Kafka 中的作用
Kafka 集群中有一個 broker 會被選舉為 Controller,負責管理集群 broker 的上下線,所 有 topic 的分區副本分配和 leader 選舉等工作。 Controller 的管理工作都是依賴於 Zookeeper 的。 以下為 partition 的 leader 選舉過程: