簡體   English   中英

為多個主題創建一個 kafka 消費者

[英]creating one kafka consumer for several topics

我想為多個主題創建單個 kafka 消費者。 消費者的方法構造函數允許我為訂閱內的主題列表傳輸 arguments,如下所示:

private Consumer createConsumer() {
    Properties props = getConsumerProps();
    Consumer<String, byte[]> consumer = new KafkaConsumer<>(props);
    ArrayList<String> topicMISL = new ArrayList<>();
    for (String s:Connect2Redshift.kafkaTopics) {
        topicMISL.add(systemID + "." + s);
    }
    consumer.subscribe(topicMISL);
    return consumer;
}


private boolean consumeMessages( Duration duration, Consumer<String, byte[]> consumer) {
        try {  Long start = System.currentTimeMillis();
            ConsumerRecords<String, byte[]> consumerRecords = consumer.poll(duration);
            }
   }

之后,我想每 3 秒將來自 kafka 的記錄輪詢到 stream 並處理它們,但我想知道這個消費者內部是什么 - 如何輪詢來自不同主題的記錄 - 首先是一個主題,然后是另一個主題,或者並行。 會不會一直處理一個消息量大的主題,而另一個消息量少的主題會等待?

一般來說,這取決於您的主題設置。 Kafka 通過每個主題使用多個分區進行擴展。

  • 如果您在 1 個主題上有 3 個分區,kafka 可以並行讀取它們
  • 多個主題也是如此,閱讀可以並行進行

如果您有一個分區接收的消息比其他分區多得多,您可能會遇到此特定分區的消費者滯后的情況。 調整批量大小和消費者設置可能會對他們有所幫助,也可以壓縮消息。 理想情況下,確保平均分配負載可以避免這種情況。

查看這篇博客文章,它讓我對內部有了很好的了解: https://www.confluent.io/blog/configure-kafka-to-minimize-latency/

ConsumerRecords<String, String> records = consumer.poll(long value);
    for (TopicPartition partition : records.partitions()) {
        List<ConsumerRecord<String, String>> partitionRecords = records.records(partition);
        for (ConsumerRecord<String, String> record : partitionRecords) {
            
        }
        
    }

還需要通過使用 consumer.commitSync 查找偏移量和提交來提交偏移量

暫無
暫無

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

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