在 Kafka 生产者上启用幂等性是否会降低吞吐量

Sma*_*guy 9 apache-kafka kafka-producer-api

我在休息端点调用中启用了幂等性的kafka 生产者(没有启用一次语义或事务)。我启用它的原因是因为我不希望卡夫卡重试导致任何重复。我担心以下几点:

  • 幂等性会减慢我的端点速度吗?(这个端点需要非常快)
  • 我读了 kafka api 文档,启用幂等性将使重试无限(什么?)
  • 如果我不将幂等性用于事务,我真的需要幂等性吗?

mik*_*ike 15

Apache Kafka 3.0 更新\n根据Apache Kafka 3.0 的公告,生产者默认启用最强的交付保证(acks=all,\xc2\xa0 enable.idempotence=true)。这意味着用户现在默认获得订购和持久性。

\n
\n
\n

“幂等性会减慢我的端点速度吗?(这个端点需要非常快)”

\n
\n

Kafka 允许使用内部序列号以幂等方式生成消息。这是在代理端缓存和比较的,因此生成消息会更耗时。此外,虽然您可以有多个正在进行的写入请求,但如果一个请求失败,后续的几个请求也会失败,并出现可重试的 OutOfSequenceException,这也可能会减慢生产者的速度。

\n

然而,与禁用幂等性的生产者相比,这两个确实是很小的补充,而且我不知道有任何综合基准来衡量吞吐量或延迟的差异。最好是在您的实际环境中进行测试。

\n
\n

“我读了 kafka api 文档,启用幂等性将使重试无限(什么?)”

\n
\n

根据配置enable.idempotence的描述,它说:“当设置为“true”时,生产者将确保每条消息的副本准确地写入流中。如果“false”,生产者将重试代理失败等,可能会在流中写入重试消息的重复项。请注意,启用幂等性需要max.in.flight.requests.per.connection小于或等于 5,retries大于 0 并且acks必须为“all”。如果这些值是如果用户没有明确设置,则会选择合适的值。如果设置了不兼容的值,则会抛出 ConfigException。

\n

请记住,重试的默认值是无论如何2147483647(我认为是无限的)。请随意将此值设置为较小的数字,但仍大于 0。

\n

关于幂等 KafkaProducer 的排序保证,即使有多个正在进行的请求,我已经在这里写了一个答案。

\n
\n

“如果我不将幂等性用于交易,我真的需要幂等性吗?”

\n
\n

我无法告诉您的要求是什么,但在生产者端启用幂等性可确保不会因代理或生产者故障而创建重复项。

\n

请记住,Kafka 中的事务有两个方面,不仅是生产者,还包括消费者。如果您使用事务,您还需要查看您的消费者配置isolation.level

\n