为什么我不能增加session.timeout.ms?

时间:2016-07-15 23:32:04

标签: apache-kafka

我想增加session.timeout.ms,以便有更长的时间来处理poll()次来电之间收到的消息。但是,当我将session.timeout.ms更改为高于30000的值时,它无法创建Consumer对象并抛出错误。

有人能告诉我为什么不能增加session.timeout.ms值或者我错过了什么?

0    [main] INFO  org.apache.kafka.clients.consumer.ConsumerConfig  - ConsumerConfig values: 

request.timeout.ms = 40000
check.crcs = true
retry.backoff.ms = 100
ssl.truststore.password = null
ssl.keymanager.algorithm = SunX509
receive.buffer.bytes = 262144
ssl.cipher.suites = null
ssl.key.password = null
sasl.kerberos.ticket.renew.jitter = 0.05
ssl.provider = null
sasl.kerberos.service.name = null
session.timeout.ms = 40000
sasl.kerberos.ticket.renew.window.factor = 0.8
bootstrap.servers = [server-name:9092]
client.id = 
fetch.max.wait.ms = 500
fetch.min.bytes = 50000
key.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
sasl.kerberos.kinit.cmd = /usr/bin/kinit
auto.offset.reset = latest
value.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
ssl.enabled.protocols = [TLSv1.2, TLSv1.1, TLSv1]
partition.assignment.strategy = [org.apache.kafka.clients.consumer.RangeAssignor]
ssl.endpoint.identification.algorithm = null
max.partition.fetch.bytes = 2097152
ssl.keystore.location = null
ssl.truststore.location = null
ssl.keystore.password = null
metrics.sample.window.ms = 30000
metadata.max.age.ms = 300000
security.protocol = PLAINTEXT
auto.commit.interval.ms = 5000
ssl.protocol = TLS
sasl.kerberos.min.time.before.relogin = 60000
connections.max.idle.ms = 540000
ssl.trustmanager.algorithm = PKIX
group.id = test7
enable.auto.commit = false
metric.reporters = []
ssl.truststore.type = JKS
send.buffer.bytes = 131072
reconnect.backoff.ms = 50
metrics.num.samples = 2
ssl.keystore.type = JKS
heartbeat.interval.ms = 3000
  

线程“main”中的异常org.apache.kafka.common.KafkaException:   无法构建kafka消费者   org.apache.kafka.clients.consumer.KafkaConsumer。(KafkaConsumer.java:624)     在   org.apache.kafka.clients.consumer.KafkaConsumer。(KafkaConsumer.java:518)     在   org.apache.kafka.clients.consumer.KafkaConsumer。(KafkaConsumer.java:500)

5 个答案:

答案 0 :(得分:12)

消费者会话超时范围由经纪人group.max.session.timeout.ms(默认30秒)和group.min.session.timeout.ms(默认为6秒)控制。

您应首先在代理方增加group.max.session.timeout.ms,否则您将获得"会话超时不在可接受的范围内。"。

答案 1 :(得分:11)

  • 需要记住这些条件以更改session.timeout.ms:
    1. server.properties中的group.max.session.timeout.ms> consumer.properties中的session.timeout.ms。
    2. server.properties中的group.min.session.timeout.ms< consumer.properties中的session.timeout.ms。
    3. request.timeout.ms> session.timeout.ms和fetch.max.wait.ms
    4. (session.timeout.ms)/ 3> heartbeat.interval.ms
    5. session.timeout.ms>每个消费者调查的消费者记录的最差案件处理时间(毫秒)。

答案 2 :(得分:1)

我正在使用spring-kafka

我添加了以下配置,但使用者仍未启动:

buildProperties.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, env.getProperty("kafka.user-events-min-bytes"));
    buildProperties.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, env.getProperty("kafka.user-events-wait-time-ms") );
    buildProperties.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, env.getProperty("kafka.user-events-wait-time-ms") );
    buildProperties.put(ConsumerConfig.REQUEST_TIMEOUT_MS_CONFIG, env.getProperty("kafka.user-events-request-timeout-ms"));
    buildProperties.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, env.getProperty("kafka.user-events-wait-time-ms"));

我发现它失败了,因为poll.timeout是1000; 添加以下配置有帮助:

factory.getContainerProperties().setPollTimeout(Integer.parseInt(env.getProperty("kafka.user-events-wait-time-ms")));

答案 3 :(得分:0)

此问题的其他答案正确描述了错误以及如何增加session.timeout.ms时,有一种更好,更直接的方法可以解决原始目标:

允许更长的时间来处理在poll()次呼叫之间收到的消息

在现代Kafka版本中实现此目的的最佳方法是将使用者配置中的max.poll.interval.ms直接设置为更高的值。

当今大多数当代客户端库都基于librdkafka,后者具有发送心跳的后台线程。 librdkafka CONFIGURATION文档将session.timeout.ms描述为:

客户端组会话和故障检测超时。消费者发送定期心跳(heartbeat.interval.ms),以向代理指示其活动状态。如果经纪人在会话超时内未收到组成员的心,则经纪人将从该组中删除消费者并触发重新平衡。

max.poll.interval.ms(默认为300000ms或5分钟)描述为:k

通话之间允许高级消费者使用消息(例如rd_kafka_consumer_poll())的最大时间。如果超过此时间间隔,则认为该使用者失败了,该组将重新平衡,以便将分区重新分配给另一个使用者组成员。警告:此时可能无法进行偏移提交。注意:建议为长时间处理的应用程序设置enable.auto.offset.store=false,然后在消息处理之后显式存储偏移(使用offsets_store()),以确保在处理完成之前不自动提交偏移。每秒检查一次该间隔两次。有关更多信息,请参见KIP-62

心跳支持(KIP-62)已在版本0.10.1中添加到Kafka。这比增加session.timeout.ms更好的原因是,代理可以区分完全消失(例如崩溃,网络中断)和长处理时间的消费者客户端。在前一种情况下,经纪人可以更快地重新平衡到另一个消费者。

答案 4 :(得分:0)

How to set max.poll.records in Kafka-Connect API

已解决。我在connect-avro-standalone.properties中添加了以下配置

group.id = mygroup Consumer.max.poll.records = 1000