java - Kafka 重试配置和性能影响

标签 java apache-kafka kafka-producer-api

我正在考虑设置重试机制来覆盖网络信号,我认为如果重试机制覆盖几分钟,比如 2-5 分钟,那对于轻微的网络问题就足够了。
根据对此的回答 question要设置的配置文件主要是retries , max.in.flight.requests.per.connection (建议kafka设置为1),retry.backoff.msdelivery.timeout.ms .
我担心的是设置 max.in.flight.requests.per.connection to 1 可能对性能有影响吗?任何人都有这方面的经验? kafka 生产者与代理集群的默认连接数是多少?我在网上找不到有关它的信息。

最佳答案

max.in.flight.requests.per.connection
事实上,这是关于生产者性能的最重要的配置参数之一,特别是生产者的吞吐量和延迟。该参数控制在阻塞之前,生产者将在单个连接上发送到某个分区的最大未确认请求数 .
换句话说,它将发送单个请求,并且在收到确认之前,它不会向代理发送另一个请求(针对该分区)。作为建议,如果您不需要对所有消息进行排序,请不要将此参数设置为 1。
关于retries及其与此参数的链接:

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 ,因为您的生产者的吞吐量确实会降低。
在简历中:将其设置为仅一个 如果您正在寻找 Activity 的有序交付 .
In this test ,吞吐量和延迟在增加时显示出不错的改进 max.in.flight.requests从 1 到 2。
吞吐量
enter image description here
延迟
enter image description here

acks
这里还有另一个参数,连同你已经引用的参数,acks 的数量。放。
例如, acks = 0 将使两者retriesmax.in.flight params 完全无关,因为生产者不会等待任何经纪人的任何确认,并且会假设每个请求都成功了。就像 UDP 发送者一样。
acks=0 :
1- retries不生效,因为无法知道是否发生了任何故障。
2- max.in.flight不会生效,因为没有任何可能的未确认请求。
设置acks大于0,例如acks=2 , 也会对性能产生直接影响,因为对于被识别为成功的请求,2 acks必须从集群接收。这意味着,例如,在飞行请求中仅指定 1 的生产者的阻塞时间通常会增加,因为它必须在解除阻塞并能够发送下一个请求之前等待 2 条 ack 消息 对于那个分区。

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概念,在链接中进行了更深入的解释。

Design for max.in.flight > 1 with idempotence enabled
enter image description here

简历中 ,您应该判断您的用例的要求是什么。像这样的问题:
是否需要订购交货?
重复的消息是可以接受的吗?
您是否认为某些消息丢失/无序是可以接受的吞吐量和延迟?
幂等生产者是否可以满足您的要求,以实现性能和消息排序/成功请求保证之间的平衡?

This presentation或多或少恢复了这些配置对生产者方面的影响,值得一看。

关于java - Kafka 重试配置和性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66095050/

相关文章:

Java-错误 : Actual and formal argument lists differ in length

apache-kafka - 卡夫卡流 : setting internal topics cleanup policy to delete doesn't work

apache-kafka - 如何使用 Kafka 流式传输视频文件?

apache-spark - Spark Streaming 崩溃到 Kafka Ran out of messages before reaching ending offset exception

java - Kafka 每个消费者主题配置

apache-kafka - 如何修复 kafka.common.errors.TimeoutException : Expiring 1 record(s) xxx ms has passed since batch creation plus linger time

java - 未使用 Apache POI Java 在 Excel 中创建标题

java - 二十一点Java : Exception Error

java - 数组错误越界

apache-kafka - 验证 kafka 主题消息