【发布时间】:2021-06-13 20:11:15
【问题描述】:
作为 Kafka 的新手,试图了解 Kafka 中的重试概念。将完成什么基础重试过程? 示例 Retries 参数我们设置为 7 。现在问题在这里,
- Kafka 将全部重试 7 次?
- 会一直尝试直到成功过程?如果是这样,卡夫卡将如何得知成功?
- 如果这取决于任何参数,那么该参数是什么以及如何使用?
【问题讨论】:
标签: apache-kafka kafka-producer-api producer-consumer
作为 Kafka 的新手,试图了解 Kafka 中的重试概念。将完成什么基础重试过程? 示例 Retries 参数我们设置为 7 。现在问题在这里,
【问题讨论】:
标签: apache-kafka kafka-producer-api producer-consumer
在分布式系统中,重试是不可避免的。从网络错误到复制问题,甚至下游依赖关系中断,大规模运行的服务必须准备好尽可能优雅地遇到、识别和处理故障。
Kafka 将重试,直到启动的进程成功完成或重试计数为零。
Kafka 维护每个 API 调用(生产者、消费者和 Streams)的状态,如果错误条件满足则减少重试次数。
请通过以下 URL 中的 Sender.java 的 completeBatch 函数获取更多信息。
【讨论】:
我猜你说的是生产者重试发送失败的消息。
来自 kafka 生产者重试属性文档 -
"设置大于零的值将导致客户端重新发送任何 发送失败并出现潜在暂时性错误的记录。"
这意味着如果 kafka producer 遇到的错误被认为是“可重试的”,它将重试。并非所有错误都是可重试的——例如,如果目标 kafka 主题不存在,则尝试再次发送消息是没有意义的。 但如果例如连接中断,重试是有意义的。
重要提示 - 重试仅在您设置代理 ack != 0 时才相关。
因此,在您的示例中,您配置了 7 次重试。
我假设 ack 设置为不同于 0 的值,因为这样就不会尝试重试。
如果您的消息因不可重试错误而失败,Kafka 生产者将不会尝试再次发送该消息(它实际上会“放弃”该消息并继续处理下一条消息)。
如果您的消息因可重试错误而失败,Kafka 生产者将重试发送,直到消息发送成功或重试次数用尽(尝试了 7 次重试但均未成功)。
Kafka 客户端生产者知道您的消息何时成功发送到代理,因为当 ack 设置为 1\all 时,kafka 代理正在“确认”收到的任何消息并通知生产者(在生产者和代理之间的一种握手中) )。
查看确认和重试@https://kafka.apache.org/documentation/#producerconfigs
【讨论】:
Kafka reties 发生在 NotEnoughReplicaException 等临时异常中。
在 Kafka 版本 2.0 默认重试是 Integer.MAX
从 kafka 2.1 开始,重试受限于超时,有几个生产者配置,例如。 delivery.timeout.ms=120000ms - 默认情况下producer会重试2分钟,如果2分钟后重试不成功,请求将不会发送给broker,我们必须手动处理。
retry.backoff.ms=100ms - 默认情况下,生产者每 100ms 将重试一次,直到 delivery.timeout 达到。
【讨论】: