【问题标题】:Recovering Kafka clients (consumers/producers) after they went downKafka 客户(消费者/生产者)宕机后恢复
【发布时间】:2021-06-05 17:34:20
【问题描述】:

在与我合作的公司,我们使用Spring for Kafka 而不进行身份验证,最近我们做了一些实验来设置 Kafka 的安全性,并且我们在短时间内启用了身份验证,这导致我们微服务中的所有消费者/生产者都崩溃了! (微服务保持不变)

例外:

Authorization Exception and no authorizationExceptionRetryInterval set

org.apache.kafka.common.errors.GroupAuthorizationException: Not authorized to access group: foo-group

经过一些研究,我们发现这是 kafka 客户端的预期行为,我们需要设置 authorizationExceptionRetryInterval 属性

public void setAuthorizationExceptionRetryInterval​(java.time.Duration authorizationExceptionRetryInterval)

设置 AuthorizationException 发生后的重试间隔 由 KafkaConsumer 抛出。默认情况下,该字段为空,重试次数为 禁用。在这种情况下,容器将被停止。间隔 必须小于 max.poll.interval.ms 消费者属性。

这里有一些其他有用的链接

Setting authorizationExceptionRetryInterval for Spring Kafka

Why does the spring KafkaConsumer suspend all consumption from n topics when one fails to authorize

我想知道的是:

  1. 是身份验证失败的唯一情况 消费者/生产者下降?
  2. 如果有其他情况,如何确保我们的 消费者/生产者无需人工干预即可恢复(重启 微服务)?换句话说,如何检查是否 消费者/生产者已经启动并重新启动它们?

【问题讨论】:

    标签: spring-boot apache-kafka spring-kafka


    【解决方案1】:

    容器仅在以下情况下才会停止:

    • AuthorizationException 没有 authorizationExceptionRetryInterval
    • NoOffsetForPartitionException - 当 ConsumerConfig.AUTO_OFFSET_RESET_CONFIG 不是 earliestlatest 并且此消费者组的分区没有现有偏移量时抛出。
    • FencedInstanceIdException - 使用事务和静态组成员(意味着其他实例正在使用此实例 ID)。
    • StopAfterFenceException - 当stopContainerWhenFenced 为真时(默认为假) - 仅适用于交易
    • 任何Error(如OOME)

    【讨论】:

    猜你喜欢
    • 2011-11-22
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2019-07-12
    • 2017-11-03
    • 2015-03-25
    相关资源
    最近更新 更多