天天看點

大資料之Kafka:Kafka架構深入之生産者和消費者的分區配置設定政策

引言

我們都知道在kafka中producer向topic推送消息,而consumer是主動去拉取消息。而在topic中存在着分區和分片,那麼kafka生産者和消費者應該采用什麼樣的分區配置設定政策呢?

一、producer的分區配置設定政策

我們向topic發送消息的時候是要把messages封裝成一個ProducerRecord對象的,源碼如下:

大資料之Kafka:Kafka架構深入之生産者和消費者的分區配置設定政策

(1)可以看到後面4種是需要我們自己指定分區的,是以可以直接将消息發送到指定分區

(2)第二行需要我們指定一個key,這種是将key的hash值與topic的partition數求餘得到分區值,是不知道會發往哪一個分區的

(3)而第一行是你既沒有指定partition又沒有指定key的值,第一次調用時會随機生成一個整數(後面每次調用在這個整數上自增),将這個值與topic的 partition數取餘得到partition值,也就是常說的 round-robin 算法,這也是預設的分區配置設定政策,能夠保證負載均衡

二、consumer的分區配置設定政策

我們都知道consumer是以consumer group的名義訂閱topic,而topic中有多個partition,consumer group中又有多個consumer,那麼consumer和partition之前的對應關系又是怎樣的呢?

換句話說,就是同一個consumer group中的每一個consumer應該負責哪些分區,這個配置設定關系又是如何确定的呢?

我們都知道一個partition隻能被一個consumer消費,這能保證不重複消費消息和順序消費分區裡面的資料

可以看到org.apache.kafka.clients.consumer.internals.AbstractPartitionAssignor這個類預設有3種實作方式,如果要自定義配置設定政策的話,隻需要繼承AbstractPartitionAssignor這個類

大資料之Kafka:Kafka架構深入之生産者和消費者的分區配置設定政策

1、Range政策

range政策對應的實作類org.apache.kafka.clients.consumer.RangeAssignor

,同時這是預設的配置設定政策可以通過consumer配置partition.assignment.strategy參數來指定配置設定政策,它的值是類的全路徑,是一個數組

官方解釋如下:

大資料之Kafka:Kafka架構深入之生産者和消費者的分區配置設定政策

意思就是一個group中的兩個consumer同時訂閱了兩個topic,這兩個topic都有3個分區,其他一個consumer被配置設定到了t0p0, t0p1, t1p0, t1p1,另一個consumer被配置設定到了t0p2, t1p2,那麼為什麼會這樣配置設定呢?

這是因為range政策是基于主題進行劃分分區的

對于每個主題,我們以數字順序排列可用分區,以字典順序排列消費者。然後,将分區數量除以消費者總數,以确定配置設定給每個消費者的分區數量。如果沒有平均劃分(有餘數),那麼最初的幾個消費者将有一個額外的分區。

簡而言之,就是:

1、range配置設定政策針對的是主題(也就是說,這裡所說的分區指的某個主題的分區,消費者指的是訂閱這個主題的消費者組中的所有消費者)

2、首先,将分區按數字順序排行序,消費者按消費者名稱的字典序排好序,然後,用分區總數除以消費者總數。如果能夠除盡,則皆大歡喜,平均配置設定

3、若除不盡,則位于排序前面的消費者将多負責一個分區

2、RoundRobin(輪詢)政策

roundronbin配置設定政策的具體實作是org.apache.kafka.clients.consumer.RoundRobinAssignor

大資料之Kafka:Kafka架構深入之生産者和消費者的分區配置設定政策

意思就是一個group中的兩個consumer同時訂閱了兩個topic,這三個topic都有3個分區,其中一個consumer被配置設定到了t0p0, t0p2, t1p1,另一個consumer被配置設定到了t0p1, t1p0, t1p2,那麼為什麼會這樣配置設定呢?

這是因為輪詢配置設定政策是基于所有可用的消費者和所有可用的分區的,與前面的range政策最大的不同就是它不再局限于某個主題,如果所有的消費者執行個體的訂閱都是相同的,那麼這樣最好了,可用統一配置設定,均衡配置設定

假設,組中每個消費者訂閱的主題不一樣,配置設定過程仍然以輪詢的方式考慮每個消費者執行個體,但是如果沒有訂閱主題,則跳過執行個體。當然,這樣的話配置設定肯定不均衡。

什麼意思呢?也就是說,消費者組是一個邏輯概念,同組意味着同一時刻分區隻能被一個消費者執行個體消費,換句話說,同組意味着一個分區隻能配置設定給組中的一個消費者。事實上,同組也可以不同訂閱,這就是說雖然屬于同一個組,但是它們訂閱的主題可以是不一樣的。

根據上面的文檔我們是不是還看到一種情況:有3個主題t0、t1、t2,有3個消費者c0、c1、c2。然而c0隻訂閱到t0,c1訂閱t0、 t1,c2訂閱t0、t1、t2。其中t0有1個分區p0,t1有2個分區p0、p1,t2有3個分區p0、p1、p2,最後c0消費t0p0,c1消費t1p0,c2消費t1p1、 t2p0、t2p1,、t2p2,那為什麼會這樣呢?

首先,肯定是輪詢的方式,t0p0隻在c0中輪詢,t1p0、t1p2在c1、c2中輪詢,t2p0、t2p1、t2p2隻在c2中輪詢,結果是不是就是上面的結果

參考:https://blog.csdn.net/wjt199866/article/details/108375978