推荐答案
session.timeout.ms 参数用于控制 Kafka 消费者组中消费者与 Kafka 代理(Broker)之间的会话超时时间。如果消费者在这个时间内没有发送心跳(heartbeat),Kafka 会认为该消费者已经失效,并将其从消费者组中移除,触发重新平衡(rebalance)。
本题详细解读
1. 参数定义
session.timeout.ms是一个消费者端的配置参数,单位为毫秒。- 它定义了消费者与 Kafka 代理之间的会话超时时间。
2. 会话超时机制
- 消费者在加入消费者组后,会定期向 Kafka 代理发送心跳以表明自己仍然存活。
- 如果 Kafka 代理在
session.timeout.ms时间内没有收到消费者的心跳,代理会认为该消费者已经失效。 - 失效的消费者会被从消费者组中移除,并触发重新平衡,将分区重新分配给其他存活的消费者。
3. 参数设置建议
session.timeout.ms的值需要根据实际业务场景和消费者处理消息的速度来设置。- 如果设置过小,可能会导致频繁的重新平衡,影响系统稳定性。
- 如果设置过大,可能会导致消费者失效后较长时间才被检测到,影响消息处理的及时性。
4. 相关参数
heartbeat.interval.ms:消费者发送心跳的时间间隔,通常设置为session.timeout.ms的三分之一左右。max.poll.interval.ms:消费者处理消息的最大时间间隔,如果超过这个时间没有调用poll()方法,消费者也会被认为失效。
5. 示例配置
// www.javascriptcn.com code example
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("session.timeout.ms", "10000"); // 10秒
props.put("heartbeat.interval.ms", "3000"); // 3秒
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);