出现Kafka提交失败,堆栈信息如下:
Caused by: org.apache.kafka.clients.consumer.CommitFailedException: Offset commit cannot be completed since the consumer is not part of an active group for auto partition assignment; it is likely that the consumer was kicked out of the group.
有两个重要参数: session.timeout 和 max.poll.records
session.timeout.ms : 在使用Kafka的团队管理设施时,用于检测消费者失败的超时时间。消费者定期发送心跳来向经纪人表明其活跃度。如果代理在该会话超时到期之前没有收到心跳,那么代理将从该组中删除该消费者并启动重新平衡。
max.poll.records : 在一次调用poll()中返回的最大记录数。
根据堆栈的提示,他让增加 session.timeout.ms 时间 或者 减少 max.poll.records。
总结:
1、 使用Kafka时,消费者每次poll的数据业务处理时间不能超过kafka的max.poll.interval.ms,该参数在kafka0.10.2.1中的默认值是300s,所以要综合业务处理时间和每次poll的数据数量。
2、Java线程池大小的选择,
对于CPU密集型应用,也就是计算密集型,线程池大小应该设置为CPU核数+1;
对于IO密集型应用 ,线程池大小设置为 2*CPU核数+1.