簡體   English   中英

如何在同一台機器上運行數百名Kafka消費者?

[英]How to run hundreds of Kafka consumers on the same machine?

在Kafka文檔中,提到消費者不是線程安全的。 為了避免這個問題,我讀到為每個Java進程運行一個使用者是個好主意。 怎么能實現這一目標?

消費者的數量沒有定義,但可以根據需要改變。

謝謝,Alessio

您的文檔指定Kafka使用者不是線程安全的,這是對的。 但是,它還說你應該在不同的線程而不是進程上運行使用者。 那是完全不同的。 請參閱此處以獲取更具體的答案,面向Java / JVM: https//stackoverflow.com/a/15795159/236528

通常,您可以在Kafka主題上擁有任意數量的消費者。 其中一些可能共享組ID ,在這種情況下,該主題的所有分區將分布在任何時間點活動的所有消費者中。

關於Kafka Consumer的Javadoc有更多細節,鏈接在這個答案的底部,但我復制了下面文檔中建議的兩個線程/消費者模型。

1.每個線程一個消費者

一個簡單的選擇是為每個線程提供自己的消費者實例。 以下是此方法的優缺點:

PRO:這是最容易實現的

PRO:它通常是最快的,因為不需要線程間的協調

PRO:它使每個分區的有序處理非常容易實現(每個線程只按接收順序處理消息)。

CON:更多的消費者意味着與群集的TCP連接更多(每個線程一個)。 一般來說,Kafka非常有效地處理連接,因此這通常是一個很小的成本。

CON:多個使用者意味着更多的請求被發送到服務器,而數據的批量略少,這可能導致I / O吞吐量的一些下降。

CON:所有進程中的總線程數將受到分區總數的限制。

2.消耗和加工

另一種方法是讓一個或多個消費者線程執行所有數據消耗,並將ConsumerRecords實例移交給實際處理記錄處理的處理器線程池所消耗的阻塞隊列。 這個選項同樣有利有弊:

PRO:此選項允許獨立擴展消費者和處理器的數量。 這使得可以讓單個消費者提供許多處理器線程,從而避免對分區的任何限制。

CON:保證處理器之間的順序需要特別小心,因為線程將獨立執行,因為線程執行時間的好運,實際上可以在稍后的數據塊之后處理較早的數據塊。 對於沒有訂購要求的處理,這不是問題。

CON:手動提交位置變得更加困難,因為它要求所有線程協調以確保該分區的處理完成。 這種方法有許多可能的變化。 例如,每個處理器線程可以擁有自己的隊列,並且使用者線程可以使用TopicPartition散列到這些隊列中,以確保按順序使用並簡化提交。

根據我的經驗,選項#1是最好的開始,只有在您真正需要時才能升級到選項#2。 選項#2是從kafka消費者中提取最大性能的唯一方法,但其實現更復雜。 因此,首先嘗試選項#1,看看它是否足以滿足您的特定用例。

完整的Javadoc可以在以下鏈接獲得: https//kafka.apache.org/23/javadoc/index.html? org /apache / kafka / client / cosumer / KafkaConsumer.html

暫無
暫無

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

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