Apache kafka Kafka消费者订阅与分配分区

Apache kafka Kafka消费者订阅与分配分区,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,卡夫卡把我弄糊涂了。我用标准值在本地运行它。 仅启用“自动创建主题”。1个分区,1个节点,所有东西都是本地的和简单的。 如果它写 consumer.subscribe("test_topic"); consumer.poll(10); 它根本不起作用,永远也找不到任何数据。 如果我改为分配一个分区,比如 consumer.assign(new TopicPartition("test_topic",0)); 检查我坐在995的位置。现在可以投票并接收制作人输入的所有数据 关于订阅,我不了解的

卡夫卡把我弄糊涂了。我用标准值在本地运行它。 仅启用“自动创建主题”。1个分区,1个节点,所有东西都是本地的和简单的。 如果它写

consumer.subscribe("test_topic");
consumer.poll(10);
它根本不起作用,永远也找不到任何数据。 如果我改为分配一个分区,比如

consumer.assign(new TopicPartition("test_topic",0));
检查我坐在995的位置。现在可以投票并接收制作人输入的所有数据

关于订阅,我不了解的是什么?我不需要多个使用者,每个使用者只处理一部分数据。我的消费者需要获取某个主题的所有数据。为什么所有教程中都显示的标准订阅方法对我不起作用? 我知道分区是用于负载平衡的消费者的。我不明白订阅有什么不对

consumer config properties
    props.put("bootstrap.servers", "localhost:9092");
    props.put("group.id", "postproc-" + EnvUtils.getAppInst()); // jeder ist eine eigene gruppe -> kriegt alles
    props.put("enable.auto.commit", "true");
    props.put("auto.commit.interval.ms", "1000");
    props.put("session.timeout.ms", "30000");
    props.put("key.deserializer", "org.apache.kafka.common.serialization.LongDeserializer");
    props.put("value.deserializer", "org.apache.kafka.common.serialization.ByteArrayDeserializer");
    KafkaConsumer<Long, byte[]> consumer = new KafkaConsumer<Long, byte[]>(props);

producer config
 props.put("bootstrap.servers", "localhost:9092");
        props.put("acks", "all");
        props.put("retries", 2);
        props.put("batch.size", 16384);
        props.put("linger.ms", 5000);
        props.put("buffer.memory", 1024 * 1024 * 10); // 10mb
        props.put("key.serializer", "org.apache.kafka.common.serialization.LongSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.ByteArraySerializer");
        return new KafkaProducer(props);

producer execution
try (ByteArrayOutputStream out = new ByteArrayOutputStream()){
            event.writeDelimitedTo(out);
            for (long a = 10; a<20;a++){
                long rand=new Random(a).nextLong();
                producer.send(new ProducerRecord<>("test_topic",rand ,out.toByteArray()));
            }
            producer.flush();
        }catch (IOException e){
消费者配置属性
put(“bootstrap.servers”,“localhost:9092”);
props.put(“group.id”,“postproc-”+EnvUtils.getAppInst());//杰德是格鲁佩的名字->克里格特的名字
props.put(“enable.auto.commit”、“true”);
props.put(“auto.commit.interval.ms”,“1000”);
props.put(“session.timeout.ms”,“30000”);
put(“key.deserializer”、“org.apache.kafka.common.serialization.LongDeserializer”);
put(“value.deserializer”、“org.apache.kafka.common.serialization.ByteArraydSerializer”);
卡夫卡消费者=新卡夫卡消费者(道具);
生产者配置
put(“bootstrap.servers”,“localhost:9092”);
道具放置(“阿克斯”、“全部”);
道具放置(“重试”,2);
道具放置(“批量大小”,16384);
道具放置(“玲儿.小姐”,5000);
props.put(“buffer.memory”,1024*1024*10);//10mb
put(“key.serializer”、“org.apache.kafka.common.serialization.longeserializer”);
put(“value.serializer”、“org.apache.kafka.common.serialization.ByteArraySerializer”);
归还新卡夫卡制作人(道具);
生产者执行
try(ByteArrayOutputStream out=newbytearrayoutputstream()){
事件。写入限制到(输出);

对于(长a=10;a我认为你错过了这个属性

auto.offset.reset=earliest
如果卡夫卡中没有初始偏移或当前 服务器上不再存在偏移量(例如,因为该数据 已删除):

  • 最早:自动将偏移重置为最早偏移
  • 最新:自动将偏移重置为最新偏移
  • 无:如果没有为使用者的组找到以前的偏移量,则向使用者抛出异常
  • 其他:向消费者抛出异常

参考资料:

我成功地解决了这个问题。问题是超时。在堆积时,我没有给它足够的时间来完成。我假设分配分区要快得多,因此完成得很及时。标准订阅轮询需要更长的时间。从未真正完成,也没有提交。
至少我认为这是问题所在。超时时间越长,它就越有效。

问题出在哪个特定的超时时间?
auto.offset.reset=earliest