簡體   English   中英

多個 Kafka 生產者寫入同一主題 - 如何負載平衡消費

[英]Multiple Kafka Producers writing to the same topic - how to load balance consumption

所以我有一個設計,我有多個生產者 P1、P2、P3、P4... PN 寫入具有 32 個分區的單個主題 T1。

另一方面,我在一個消費者組中最多有 32 個消費者。

我想對我的消息消耗進行負載平衡。

閱讀文檔我可以看到 3 個選項:
1. 自己定義分區(缺點我必須知道最后一條消息是在哪里發送的或者為每個Producer P定義一個分區范圍)
2. 定義一個鍵並將分區決策留給 Kafka hash 算法(缺點 - 負載平衡將根據運氣定義)

(根據克里斯的回答,負載平衡應該留給 hash 算法) - 現實情況表明,這並沒有為消費者提供平等的分配,因為消費者綁定到分區,我必須了解 hash 算法才能選擇一個好的密鑰 -對我來說,這聽起來與選擇分區相同(並且必須分配給生產者)

我當前的代碼使用 UUID 作為鍵。 對所選分區以及消費者工作的分析表明,分布可能遠非相等。 我在下面復制它:

分區收到的消息 上圖顯示了每個分區在 5 分鍾內收到的消息數量 window 使用 UUID 作為我的鍵 - 在那個時間點我有 8 個消費者。 消耗大約需要2分鍾。 紅色單元格顯示其中一個消費者中有 9 個請求隊列,而其他消費者的負載較低 - 或者像綠色消費者一樣為零負載。 如果隨機密鑰不是一個好的選擇,我應該選擇什么?

  1. 沒有分區,沒有密鑰,留給 Kafka 循環算法(缺點循環是生產者內部的 - 這意味着所有生產者都可以將消息發送到同一個分區 - 我也測試了這個選項,結果如下:

循環是生產者內部的 上圖顯示循環顯然是生產者內部的。

我真的需要自己編寫整體負載均衡算法嗎? 我錯過了什么嗎?

跨消費者平衡負載是 Kafka 的定義功能之一,它允許水平擴展。

生產者使用的記錄密鑰允許它工作。 鍵定義了消息在哪個分區上進行,任何分區都將由一個消費者按順序使用,因此您的生產者應該使用一種產生均勻分布的鍵策略,並確保相關消息在排序很重要時具有相同的鍵(熊請記住,如果嚴格訂購至關重要,則在飛行請求中還有其他考慮因素)。

前者是平衡負載的方式——消費者中不涉及循環,分區只是在每個組中的消費者之間盡可能均勻地共享,並且它們獨立輪詢。 如果鍵分布良好,則每個分區將具有大致相同數量的記錄。

因此,要實現有效的負載平衡,您唯一的責任就是使用一個好的策略來創建消息鍵,並使用至少與您計划將消費擴展到的分區一樣多的分區來定義您的主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM