Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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
Java 卡夫卡0.10.2消费者获得大量复制品_Java_Multithreading_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Java 卡夫卡0.10.2消费者获得大量复制品

Java 卡夫卡0.10.2消费者获得大量复制品,java,multithreading,apache-kafka,kafka-consumer-api,Java,Multithreading,Apache Kafka,Kafka Consumer Api,我有一个相当简单的卡夫卡设置-1个生产者,1个主题,10个分区,10个卡夫卡消费者,所有这些都具有相同的组ID,都在一台机器上运行。当我处理一个文件时,生产者会快速创建3269条消息,消费者会很高兴地开始使用这些消息。在一段时间内,一切正常,但在某一点上,消费者开始消费重复品——大量重复品。事实上,看起来他们刚刚开始再次使用消息队列。如果让它运行很长时间,数据库将开始接收相同的数据条目6次或更多次。在对日志进行一些测试之后,使用者似乎正在重新使用具有相同唯一消息名称的相同消息 据我所知,没有发生

我有一个相当简单的卡夫卡设置-1个生产者,1个主题,10个分区,10个卡夫卡消费者,所有这些都具有相同的组ID,都在一台机器上运行。当我处理一个文件时,生产者会快速创建3269条消息,消费者会很高兴地开始使用这些消息。在一段时间内,一切正常,但在某一点上,消费者开始消费重复品——大量重复品。事实上,看起来他们刚刚开始再次使用消息队列。如果让它运行很长时间,数据库将开始接收相同的数据条目6次或更多次。在对日志进行一些测试之后,使用者似乎正在重新使用具有相同唯一消息名称的相同消息

据我所知,没有发生重新平衡。消费者并没有死亡或被增加。这是同样的10个消费者,一次又一次地消费同样的3269条消息,直到我终止这个进程。如果我放手,消费者将写入数万条记录,这大大增加了真正应该进入数据库的数据量

我对卡夫卡还很陌生,但我有点不明白为什么会发生这种事。我知道卡夫卡不能保证只处理一次,我可以在这里和那里复制几次。我有防止再次保存相同记录的代码。但是,我不确定消费者为什么会一次又一次地重复使用队列。我知道Kafka消息在被消费后不会被删除,但是如果所有的消费者都在同一个组中,那么偏移量应该可以防止这种情况发生,对吗?我了解一点补偿是如何工作的,但据我所知,如果没有重新平衡,它们不应该被重置,对吗?据我所知,这些信息并没有超时。我是否有办法让我的消费者一次性消费队列中的所有内容,然后等待更多消息,而不必永远重复消费相同的内容

以下是我传递给生产者和消费者的财产:

Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("acks", "all");
        props.put("retries", 0);
        props.put("batch.size", 16384);
        props.put("linger.ms", 1);
        props.put("buffer.memory", 33554432);
        props.put("group.id", "MyGroup");
        props.put("num.partitions", 10);
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        MyIngester ingester = new MyIngester(args[0], props);

对我来说,这似乎是一个确认收据的问题。 请尝试以下属性

    props.put("enable.auto.commit", "true");
    props.put("auto.commit.interval.ms", "100");