嗨,我有kafka使用者正在使用数据。下面的命令给了我消费者组命令超时。
kafka-consumer-groups.sh --bootstrap-server b1:9092,b2:9092,b3:9092,b4:9092,b5:9092,b6:9092,b7:9092,b8:9092,b9:9092,b10:9092,b11:9092,b12:9092,b13:9092 --describe --group testgroup
错误:由于消费者组命令在等待组初始化时超时,因此执行消费者组命令失败:
所有使用者都在使用数据超过26个小时。由于生产者在这6个小时内不再生产数据,因此存在超过6个小时的时间间隔。
我怀疑有一些空闲时间可能会断开消费者组与消费者之间的联系。所有使用者均以100毫秒poll(100)
的轮询间隔进行消耗。
这种情况已经观察了3次以上。感谢Kafka专家的任何帮助。谢谢。
代码:
@Service
public class DedupeConsumerService {
final Logger logger = LoggerFactory.getLogger(DedupeConsumerService.class);
@Autowired
private TaskExecutor taskExecutor;
@Autowired
private PropertyConfig config;
@Autowired
private ApplicationContext applicationContext;
public void consume() {
String topic = config.getDedupServiceConsumerTopic();
String consGroup = config.getDedupServiceConsGroup();
Properties props = new Properties();
props.put("enable.auto.commit", "false");
props.put("session.timeout.ms", "20000");
props.put("max.poll.records", "10000");
KafkaConsumer<String, AvroSyslogMessage> consumer = new GenericConsumer<String, AvroSyslogMessage>().initialize(topic, consGroup, STREAMSERDE.STRINGDESER, STREAMSERDE.AVRODESER, props);
logger.info("Dedupe Kafka Consumer Initialized......");
try {
while (true) {
ConsumerRecords<String, AvroSyslogMessage> records = consumer.poll(100);
if (records.count() > 0) {
}
logger.info("Number of Records:: " + records.count() + " Time took to process poll :: " + durationInMilliSec);
}
}
} catch (Throwable e) {
logger.error("Error occured while processing message", e);
e.printStackTrace();
} finally {
logger.debug("dedupe kafka consume is closing");
consumer.close();
}
}
}
我尝试将轮询时间设为Integer.MAX_VALUE
,但这没有帮助。
答案 0 :(得分:0)
考虑为您的消费者配置心跳设置:https://docs.confluent.io/platform/current/installation/configuration/consumer-configs.html#consumerconfigs_heartbeat.interval.ms
Heartbeat 将确保连接不会自动关闭(很像 keep-alive)。