Kafka 重试配置和性能影响

Kafka retries config and performance implications

我正在考虑设置重试机制以覆盖各处的网络故障,我认为如果重试机制覆盖几分钟,比如 2-5 分钟,就足以解决轻微的网络问题。 根据这个 question 和文档的回答,要设置的配置主要是 retriesmax.in.flight.requests.per.connection(建议由 kafka 设置为 1)、retry.backoff.msdelivery.timeout.ms.

我担心将 max.in.flight.requests.per.connection 设置为 1 可能会影响性能?有人有这方面的经验吗? kafka 生产者与代理集群建立的默认连接数是多少?我在网上找不到相关信息。

max.in.flight.requests.per.connection

的确,这是关于生产者性能的最重要的配置参数之一,特别是生产者的吞吐量和延迟。此参数控制生产者在阻塞前将发送到单个连接上的特定分区的最大未确认请求数

换句话说,它将发送一个请求,并且在收到确认之前,它不会向代理发送另一个请求(对于该分区)。作为建议,如果您不需要对所有消息进行排序,请不要将此参数设置为 1。

关于 retries 及其对这个参数的 link:

Allowing retries without setting max.in.flight.requests.per.connection to 1 will potentially change the ordering of records because if two batches are sent to a single partition, and the first fails and is retried but the second succeeds, then the records in the second batch may appear first.

所以不是很建议kafka设置为1;建议当您需要订购送货时。如果您不需要这种情况发生,请不要将 max.in.flight.requests.per.connection 设置为 1,因为您的生产者的吞吐量确实会降低。

在简历中:将其设置为仅一个如果您正在寻找事件的有序交付

In this test,当将 max.in.flight.requests 从 1 增加到 2 时,吞吐量和延迟显示出不错的改善。

吞吐量

延迟


acks

这里还涉及到另一个参数,连同你已经引用的参数,acks集的数量。

例如,acks = 0 将使 retriesmax.in.flight 参数完全无关,因为生产者不会等待任何来自任何经纪人的确认,并将假定每个请求都成功。就像一个 UDP 发送者。

acks=0:

1- retries 没有生效,因为无法知道是否发生任何故障。

2- max.in.flight 不会生效,因为根本不可能有 未确认的请求

设置acks大于0,例如acks=2,也会对性能有直接影响,因为一个请求被识别为成功,2acks会有从集群接收。这意味着,例如,在飞行请求中仅指定 1 个的生产者的阻塞时间通常会增加,因为它必须等待 2 个确认消息才能解除阻塞并能够发送下一个请求 该分区。


Idempotence

你的问题还有一个概念,就是幂等生产者。这可能是在性能和​​效率之间取得平衡的最佳选择。

假设您设置了一些 retries 以保证消息正确到达。代理收到消息,当它向您发送 ack 时,网络错误使您的生产者无法接收它。如果设置了重试,producer 将再次发送相同的消息,在代理中创建一个 重复的 消息。

Kafka 0.11.0 includes support for idempotent and transactional capabilities in the producer. Idempotent delivery ensures that messages are delivered exactly once to a particular topic partition during the lifetime of a single producer

An idempotent producer has a unique producer ID and uses sequence IDs for each message, which allows the broker to ensure it is committing ordered messages with no duplication, on a per partition basis.

这个幂等生产者,在较新版本的 Kafka 客户端中,默认有 5 个 max.in.flight.requests,从“旧”方式提高性能以确保交付顺序。这也是幂等生产者的最大值(从 1 到 5 是飞行请求的有效范围),在简历中,如果您需要有序、安全的管道,同时保持生产者的高性能,它是最佳选择。

幂等生产者引出了 exactly once semantics 概念,在 link 中有更深入的解释。


Design for max.in.flight > 1 with idempotence enabled


在resume中,你应该判断你的用例的需求是什么。问题如:

需要订货吗?

可以接受重复的消息吗?

您是否重视吞吐量和延迟到 一些消息 lost/unordered 可以接受的程度?

幂等生产者是否可以满足您的要求,以在性能和消息ordering/successfull请求保证之间取得平衡?


This presentation恢复了这些配置对producer端的影响,值得一看