在宕机后恢复 Kafka 客户端(消费者/生产者)

时间:2021-03-07 17:53:09

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

在我合作的公司,我们使用 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. 如果还有其他一些情况,如何确保我们的 消费者/生产者无需人工干预即可恢复(重启 微服务)?换句话说,如何检查 消费者/生产者已启动并重新启动它们?

1 个答案:

答案 0 :(得分:1)

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

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