kafka中每個主題一般都會有很多個分區,為了及時消費到數據,我們可能會啟動很多個消費者去一個消費topic中的數據。每個分區只能由消費組內的一個消費者去消費。那么,同一個消費組內的消費者是如何確定消費哪些分區的數據呢?
kafka內部中存在兩種分配策略:Range和RoundRobin。
kafka分配分區的條件:1)同一個消費組內消費者的新增、關閉或崩潰,2)訂閱的主題新增分區。
Range:
是對每個主題而言的。首先按照分區序號排序,然后將消費者排序。分區數/消費者數=m,如果m!=0,前m個消費者多消費一個分區(每個主題)
RoundRobin:
使用RoundRobin策略有兩個前提條件必須滿足:1)同一個Consumer Group里面的所有消費者的num.streams必須相等;2)每個消費者訂閱的主題必須相同。
所以這里假設前面提到的2個消費者的num.streams = 2。RoundRobin策略的工作原理:將所有主題的分區組成 TopicAndPartition 列表,然后對 TopicAndPartition 列表按照 hashCode 進行排序,分發給每一個消費者。(其實就是按分區名hash排序后平均分配給每一個消費者的線程)
總結:目前我們還不能自定義分區分配策略,只能通過partition.assignment.strategy
參數選擇 range 或 roundrobin。partition.assignment.strategy
參數默認的值是range。