【问题标题】:Kafka Consumer Assignment returns Empty SetKafka 消费者分配返回空集
【发布时间】:2019-01-24 14:44:47
【问题描述】:

我订阅了一个 Kafka 主题,如下所示。只有在为消费者分配了分区后,我才需要运行一些逻辑。

但是,无论我等多久,consumer.assignment() 都会以空集的形式返回。如果我没有 while 循环然后执行 consumer.poll() 我确实从主题中获取了记录。谁能告诉我为什么会这样?

    consumer.subscribe(topics);
    Set<TopicPartition> assigned=Collections.emptySet();
    while(isAssigned) {
          assigned = consumer.assignment();
          if(!assigned.isEmpty()) {
              isAssigned= false;
          }
    }

//consumer props
Properties props = new Properties();
        props.put("bootstrap.servers", "xxx:9092,yyy:9092");
        props.put("group.id", groupId);
        props.put("enable.auto.commit", "false");
        props.put("session.timeout.ms", "30000");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "io.confluent.kafka.serializers.KafkaAvroDeserializer");
        props.put("schema.registry.url", "http://xxx:8081");
        props.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, true);
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        props.put("max.poll.records", "100");

【问题讨论】:

  • 您能添加您正在使用的消费者属性吗?

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


【解决方案1】:

在您致电poll() 之前,消费者只是在闲置。

只有在 poll() 被调用后,它才会启动与集群的连接,获取分配的分区并尝试获取消息。

Javadoc中提到了这个:

订阅一组主题后,消费者会自动 调用 poll(Duration) 时加入群组。

一旦您开始调用poll(),您就可以使用assignment() 甚至注册ConsumerRebalanceListener,以便在您的消费者实例分配或撤销分区时收到通知。

【讨论】:

  • 以防万一这对其他人有帮助:您可能会在不调用 poll 的情况下随机分配,但这种情况很少见。如果您不知道需要投票,这可能会非常令人困惑。
  • 我不会以这种方式丢失消息吗?假设您想要访问分区列表调用 .assignement() 以重新定位偏移量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多