kafka使用新的消费者api升级到.9

时间:2016-03-09 15:46:02

标签: apache-kafka kafka-consumer-api

我们正在将我们的kafka实现升级到.9并使用新的消费者java api来创建使用者。我正在使用以下代码用于消费者,我们正在使用设置主题到消费者,如在线A和线B是对我们的服务的调用它处理我们收到的消息。现在的问题是,如果我们的消息处理时间超过30秒,我们就会收到异常。

    Properties props = new Properties();
            props.put("bootstrap.servers", "localhost:9092");
            props.put("group.id", "test-group");
            props.put("auto.offset.reset", "earliest");
            props.put("heartbeat.interval.ms", "1000");
            props.put("receive.buffer.bytes", 10485760);
            props.put("fetch.message.max.bytes", 5242880);
            props.put("enable.auto.commit", false);
    //with partition assigned to consumer


            KafkaConsumer<Object, Object> consumer = new KafkaConsumer<>(props);
           // TopicPartition partition0 = new TopicPartition("TEST-TOPIC", 0);
            //consumer.assign(Arrays.asList(partition0));
            //assign topic to consumer without partition
//LINE A
            consumer.subscribe(Arrays.asList("TEST-TOPIC"), new ConsumerRebalanceListenerImp());
            List<ConsumerRecord<String, String>> buffer = new ArrayList<>();
            while (true) {
                try {
                    ConsumerRecords<Object, Object> records = consumer.poll(1000);
                    consumeFromQueue(records);//LINE B
                    consumer.commitSync();

                } catch (CommitFailedException e) {
                    e.printStackTrace();
                    System.out.println("CommitFailedException");
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("Exception in while consuming messages");
                }

例外是

  

2016-03-03 10:47:35.095 INFO 6448 --- [ask-scheduler-3] o.a.k.c.c.internals.AbstractCoordinator:标记协调员2147483647死亡。   2016-03-03 10:47:35.096 ERROR 6448 --- [ask-scheduler-3] o.a.k.c.c.internals.ConsumerCoordinator:在为组TEST-GROUP提交偏移时发生错误ILLEGAL_GENERATION   CommitFailedException   org.apache.kafka.clients.consumer.CommitFailedException:由于组重新平衡,无法完成提交       在org.apache.kafka.clients.consumer.internals.ConsumerCoordinator $ OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:552)       在org.apache.kafka.clients.consumer.internals.ConsumerCoordinator $ OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:493)       在org.apache.kafka.clients.consumer.internals.AbstractCoordinator $ CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:665)       at org.apache.kafka.clients.consumer.internals.AbstractCoordinator $ CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:644)       在org.apache.kafka.clients.consumer.internals.RequestFuture $ 1.onSuccess(RequestFuture.java:167)       在org.apache.kafka.clients.consumer.internals.RequestFuture.fireSuccess(RequestFuture.java:133)       在org.apache.kafka.clients.consumer.internals.RequestFuture.complete(RequestFuture.java:107)       在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient $ RequestFutureCompletionHandler.onComplete(ConsumerNetworkClient.java:380)       在org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:274)       在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.clientPoll(ConsumerNetworkClient.java:320)       在org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:213)

提交偏移时出现上述异常。 任何建议都会有所帮助

2 个答案:

答案 0 :(得分:6)

这是因为新的消费者是单线程的,并且它可以通过轮询或提交偏移来保持心跳的唯一方法是,在30秒后,组协调员将您的消费者标记为已死并且正在呼叫为了团体再平衡。 对于这种情况,您可以增加request.timeout.ms或分割两个线程之间的消耗和处理工作。

答案 1 :(得分:1)

您可以通过设置

来限制poll()返回的邮件数量
max.partition.fetch.bytes

到某个合适的阈值,该阈值大于您的最大消息,但是如此之低,以至于每次轮询的消息都会减少。

Kafka 0.10.x支持通过设置

明确限制返回给客户端的邮件数量
max.poll.records