kafka消费者Java具有多个主题

时间:2018-08-27 06:50:13

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

我们有一个消费者组和三个主题,这三个主题都具有不同的架构。通过一个for循环创建了一个使用者,一次传递了每个主题,并对其进行轮询并手动进行处理和提交。使用的方法是用户创建的通用方法,在for循环中,我一次订阅一个主题并处理数据。 我看到了一个随机的用户延迟,尽管该主题具有我的用户未从该主题获取任何记录的数据,并且有时会获取该数据。当我处理一个主题而不是遍历三个主题时,它可以工作但无法重现。 需要帮助调试问题并重现该问题,

1 个答案:

答案 0 :(得分:0)

您可以创建一个框架线程,而不是在一个方法中循环三个主题,这样就可以从任何主题使用它。 See examples here

我不能说这是否可以“解决”问题,但是在一个应用程序中尝试从具有不同模式的主题中消费通常不是可扩展的模式,但是并不清楚您要做什么。

class ConsumerThread extends Thread {

    KafkaConsumer consumer;
    AtomicBoolean stopped = new AtomicBoolean();

    ConsumerThread(Properties props, String subscribePattern) {
        this.consumer = new KafkaConsumer...
        this.consumer.subscribe(subscribePattern);
    } 

    @Override
    public void run() {
        while (!this.stopped.get()) {
            ... records = this.consumer.poll(100);
            for ( ... each record ... ) {
               // Process record
            } 
        }
    }

    public void stop() {
        this.stopped.set(true);
    }
}

不意味着是生产级

然后独立运行三个消费者。

new ConsumerThread("t1").start();
new ConsumerThread("t2").start();
new ConsumerThread("t3").start();

注意KafkaConsumer不是线程安全的。