为多个主题创建一个kafka消费者

时间:2020-06-22 07:15:56

标签: java apache-kafka kafka-consumer-api

我想为几个主题创建单个kafka用户。消费者的方法构造函数使我可以为订阅内的主题列表传递参数,例如:

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轮询记录到流中并对其进行处理,但是我想知道此使用者内部是什么-如何轮询来自不同主题的记录-首先是一个主题,然后是另一个主题,或并行进行。可能是一个消息量很大的话题一直都在处理,而另一个消息量很小的话题会一直在等待吗?

2 个答案:

答案 0 :(得分:0)

通常,这取决于您的主题设置。 Kafka通过每个主题使用多个分区来扩展规模。

  • 如果您在1个主题上有3个分区,则kafka可以并行读取它们
  • 对于多个主题也是如此,阅读可以并行进行

如果您的分区收到的消息比其他分区多得多,则可能会遇到该特定分区的使用者滞后的情况。调整批处理大小和使用者设置可以帮助他们,也可以压缩消息。 理想情况下,确保平均分配负载可以避免这种情况。

看看这篇博客文章,它使我对内部结构有了很好的理解:https://www.confluent.io/blog/configure-kafka-to-minimize-latency/

答案 1 :(得分:0)

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进行提交