簡體   English   中英

Kafka CommitFailedException消費者異常

[英]Kafka CommitFailedException consumer exception

在創建多個使用者(使用Kafka 0.9 java API)並且每個線程啟動后,我得到以下異常

Consumer has failed with exception: org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed due to group rebalance
class com.messagehub.consumer.Consumer is shutting down.
org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed due to group rebalance
at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator$OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:546)
at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator$OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:487)
at org.apache.kafka.clients.consumer.internals.AbstractCoordinator$CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:681)
at org.apache.kafka.clients.consumer.internals.AbstractCoordinator$CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:654)
at org.apache.kafka.clients.consumer.internals.RequestFuture$1.onSuccess(RequestFuture.java:167)
at org.apache.kafka.clients.consumer.internals.RequestFuture.fireSuccess(RequestFuture.java:133)
at org.apache.kafka.clients.consumer.internals.RequestFuture.complete(RequestFuture.java:107)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient$RequestFutureCompletionHandler.onComplete(ConsumerNetworkClient.java:350)
at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:288)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.clientPoll(ConsumerNetworkClient.java:303)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:197)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:187)
at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:157)
at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.commitOffsetsSync(ConsumerCoordinator.java:352)
at org.apache.kafka.clients.consumer.KafkaConsumer.commitSync(KafkaConsumer.java:936)
at org.apache.kafka.clients.consumer.KafkaConsumer.commitSync(KafkaConsumer.java:905)

然后開始正常消費消息,我想知道導致此異常的原因是為了解決它。

還要嘗試調整以下參數:

  • heartbeat.interval.ms - 這告訴Kafka在考慮將消費者視為“死亡”之前等待指定的毫秒數
  • max.partition.fetch.bytes - 這將限制消費者在輪詢時將收到的消息量(最多)。

我注意到,如果消費者在心跳超時之前沒有提交Kafka,則會發生重新平衡。 如果在處理消息后發生提交,則處理它們的時間將決定這些參數。 因此,減少消息數量和增加心跳時間將有助於避免重新平衡。

還要考慮使用更多分區,因此將有更多線程處理您的數據,即使每次輪詢的消息更少。

我寫了這個小應用程序來進行測試。 希望能幫助到你。

https://github.com/ajkret/kafka-sample

UPDATE

Kafka 0.10.x現在提供了一個新參數來控制收到的消息數量: - max.poll.records - 一次調用poll()時返回的最大記錄數。

UPDATE

Kafka提供了一種暫停隊列的方法。 隊列暫停時,您可以在單獨的線程中處理消息,允許您調用KafkaConsumer.poll()來發送心跳。 然后在處理完成后調用KafkaConsumer.resume() 這樣可以緩解因不發送心跳而導致重新平衡的問題。 以下是您可以執行的操作的概述:

while(true) {
    ConsumerRecords records = consumer.poll(Integer.MAX_VALUE);
    consumer.commitSync();

    consumer.pause();
    for(ConsumerRecord record: records) {

        Future<Boolean> future = workers.submit(() -> {
            // Process
            return true;
        }); 


       while (true) {
            try {
                if (future.get(1, TimeUnit.SECONDS) != null) {
                    break;
                }
            } catch (java.util.concurrent.TimeoutException e) {
                getConsumer().poll(0);
            }
        }
    }

    consumer.resume();
}

正如錯誤所述,其消費者群體重新平衡問題。 你能告訴我們,創建了多少分區主題? 有多少消費者在運營? 他們屬於同一個群體嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM