【发布时间】:2021-04-21 17:17:08
【问题描述】:
将 In-Sync 副本配置为 Acks=all 和 min.insync.replicas = N,
想了解如何为未处理的生产者记录的消息/记录配置重试
示例: 当 Kafka 处理记录失败时,处理过程中在线 ISR 为 N-1,并且最小配置的 ISR 为 N 个副本。
【问题讨论】:
标签: apache-kafka kafka-producer-api
将 In-Sync 副本配置为 Acks=all 和 min.insync.replicas = N,
想了解如何为未处理的生产者记录的消息/记录配置重试
示例: 当 Kafka 处理记录失败时,处理过程中在线 ISR 为 N-1,并且最小配置的 ISR 为 N 个副本。
【问题讨论】:
标签: apache-kafka kafka-producer-api
什么是acks?
acks 参数控制生产者必须接收多少个分区副本才能认为写入成功。
acks参数有3个值:
acks=0,生产者在假定消息发送成功之前不会等待代理的回复。
acks=1,生产者将在领导副本收到消息的那一刻收到来自代理的成功响应。如果消息无法写入leader,producer会收到错误响应,可以重试。
acks=all,一旦所有同步副本都收到消息,生产者将收到来自代理的成功响应。
在您的情况下,acks=all,这是最安全的方式,因为您可以确保另一个代理拥有该消息。
重试:
如果生产者收到错误消息,那么 retries 属性的值就会出现。您可以使用 retry.backoff.ms 属性来配置重试之间的时间。建议测试从崩溃的代理中恢复需要多长时间,并设置重试次数和它们之间的延迟,以使重试所花费的总时间比 Kafka 集群从头开始恢复所花费的时间更长。
另外,请查看以下链接,
https://www.confluent.io/blog/hands-free-kafka-replication-a-lesson-in-operational-simplicity/
【讨论】:
对于上述情况,您将收到 NotEnoughReplicasException。在这个阶段,卡夫卡重提消息 对于 kafka =2.1,此值设置为非常高的值 此外,还有另一个名为“retry.backof.ms”的设置。此设置的默认值为 100 毫秒。 Kafka 生产者将每 100 毫秒重试一次以生成此消息,直到成功。 为避免它无限次重试,或者您可以设置“delivery.timout.ms”以确保生产者重试以毫秒为单位发送消息。它的默认值为 120000 毫秒。这不过是 2 分钟。意味着 Producer 不会在 2 分钟后重试,并认为消息失败。 此外,您可能需要考虑“max.in.flight.requests”设置,以确保当您的 Kafka 消息中有 Key 时,重试消息按顺序处理
【讨论】: