Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka Consumer.poll()即使不提交偏移量也会返回新记录?_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Apache kafka Consumer.poll()即使不提交偏移量也会返回新记录?

Apache kafka Consumer.poll()即使不提交偏移量也会返回新记录?,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,如果我有一个enable.auto.commit=false并且我调用consumer.poll()而不调用consumer.commitAsync()之后,为什么consumer.poll()返回 下次打电话时会有新记录吗 由于我没有提交偏移量,我希望poll()将返回最新的偏移量,该偏移量应该是相同的记录 public class MyConsumer implements Runnable { @Override public void run() { wh

如果我有一个
enable.auto.commit=false
并且我调用
consumer.poll()
而不调用
consumer.commitAsync()
之后,为什么
consumer.poll()
返回 下次打电话时会有新记录吗

由于我没有提交偏移量,我希望
poll()
将返回最新的偏移量,该偏移量应该是相同的记录

public class MyConsumer implements Runnable {
    @Override
    public void run() {
        while (true) {
            ConsumerRecords<String, LogLine> records = consumer.poll(Long.MAX_VALUE);
            for (ConsumerRecord record : records) {
                try {
                   //process record
                   consumer.commitAsync();
                } catch (Exception e) {
                }
                /**
                If exception happens above, I was expecting poll to return new records so I can re-process the record that caused the exception. 
                **/
            }

        }
    }
}
我这样问是因为我在处理过程中试图处理失败场景。我希望在不提交偏移量的情况下,
poll()
会再次返回相同的记录,以便我可以再次重新处理那些失败的记录

public class MyConsumer implements Runnable {
    @Override
    public void run() {
        while (true) {
            ConsumerRecords<String, LogLine> records = consumer.poll(Long.MAX_VALUE);
            for (ConsumerRecord record : records) {
                try {
                   //process record
                   consumer.commitAsync();
                } catch (Exception e) {
                }
                /**
                If exception happens above, I was expecting poll to return new records so I can re-process the record that caused the exception. 
                **/
            }

        }
    }
}
公共类MyConsumer实现可运行{
@凌驾
公开募捐{
while(true){
ConsumerRecords记录=consumer.poll(Long.MAX_值);
对于(消费者记录:记录){
试一试{
//过程记录
consumer.commitAsync();
}捕获(例外e){
}
/**
如果上述异常发生,我希望轮询返回新记录,以便重新处理导致异常的记录。
**/
}
}
}
}

投票的起始偏移量不是由经纪人决定的,而是由消费者决定的。消费者跟踪上一次收到的偏移量,并在下一次轮询期间请求以下一组消息

当使用者停止或失败,并且另一个不知道上次消耗的偏移量的实例拾取分区的消耗量时,偏移量提交开始发挥作用


具有相当广泛的Javadoc,非常值得一读。

如果上次提交偏移量得到重新平衡,消费者将从中读取(意味着如果有消费者离开组或添加了新消费者)因此,在kafka中处理重复数据消除并不是直截了当的,因此您必须将最后一个进程偏移量存储在外部存储中,当发生再平衡或应用程序重新启动时,您应该寻找该偏移量并开始处理,或者您应该对照DB中的某个唯一密钥进行检查,以查找是否重复。但是“最后消耗的偏移量可以通过seek(TopicPartition,long)手动设置,也可以自动设置为订阅的分区列表的最后提交偏移量”这句话并没有像我的问题所问的那样,后者会将消耗的偏移量设置为最后提交的偏移量,这应该会导致
poll()
如果我从未提交新偏移量,则不返回新记录。我的理解正确吗?我认为文件中的部分仅指消耗的起点/补偿。因此,您可以从任何地方开始使用seek或使用提交的偏移量。您的意思是它将仅在第一次调用
poll()
时使用提交的偏移量?@Glide是的,它仅在第一次轮询时使用存储的偏移量。在调用
poll
之前,您还可以
seek
到所需的偏移量。