[英]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)
然后開始正常消費消息,我想知道導致此異常的原因是為了解決它。
還要嘗試調整以下參數:
我注意到,如果消費者在心跳超時之前沒有提交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.