[英]How to run multiple kafka consumers on the same box independent of each other?
[英]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.