【问题标题】:Why can't I increase session.timeout.ms?为什么我不能增加 session.timeout.ms?
【发布时间】:2016-11-19 06:22:08
【问题描述】:

我想增加session.timeout.ms 以允许更长的时间来处理在poll() 调用之间收到的消息。但是,当我将 session.timeout.ms 更改为高于 30000 的值时,它无法创建消费者对象并引发以下错误。

谁能告诉我为什么我不能增加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

线程“主”org.apache.kafka.common.KafkaException 中的异常: 未能在 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)

【问题讨论】:

标签: apache-kafka


【解决方案1】:

消费者会话超时的范围由代理group.max.session.timeout.ms(默认30s)和group.min.session.timeout.ms(默认6s)控制。

你应该先在broker端增加group.max.session.timeout.ms,否则你会得到“会话超时不在可接受的范围内。”。

【讨论】:

  • 谢谢,但是在 config/server.properties 添加/设置 group.max.session.timeout.ms=3600000 仍然不能解决这个问题。但是现在我收到“由:org.apache.kafka.common.config.ConfigException:request.timeout.ms 应该大于 session.timeout.ms 和 fetch.max.wait.ms”错误,这是有帮助的。
  • 这在将 request.timeout.ms 设置为大于 session.timeout.ms 的值后起作用。
【解决方案2】:

需要牢记这些条件才能更改session.timeout.ms

  1. group.max.session.timeout.ms 在 server.properties > session.timeout.ms 在 consumer.properties。
  2. server.properties 中的group.min.session.timeout.ms session.timeout.ms。
  3. request.timeout.ms > session.timeout.ms + fetch.wait.max.ms
  4. (session.timeout.ms)/3 > heartbeat.interval.ms
  5. session.timeout.ms > 每次消费者投票的消费者记录的最坏情况处理时间(毫秒)。

【讨论】:

  • 关于最后一点,最坏情况的处理时间是max.poll.interval.ms吗?为什么这很重要?后台线程不是用来保持会话活动的吗?
  • 我已将 request.timeout.ms > session.timeout.ms 设置为 request.timeout.ms=25000, session.timeout.ms=20000 并且问题已解决
  • 回想起来,你还觉得是对的吗? request.timeout.ms 与 session.timeout.ms 无关?如果是这样,你能在这里解释一下相关性吗?
【解决方案3】:

我正在使用 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")));

【讨论】:

    【解决方案4】:

    虽然此问题的其他答案正确地描述了错误以及如何增加session.timeout.ms,但还有一种更好、更直接的方法来解决最初的目标:

    允许更长的时间来处理在poll() 调用之间收到的消息

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

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

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

    其中max.poll.interval.ms(默认为 300000 毫秒,或 5 分钟)描述为:k

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

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-10-25
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多