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

Does enabling Idempotence on a Kafka producer decrease throughput

我有一个 kafka 生产者 idempotence enabled(没有启用 exactly once 语义或事务)在 rest 端点调用中。我启用它的原因是因为我不希望 kafka 重试导致任何重复。我担心以下问题:

Apache Kafka 3.0 更新 根据 Announcement of Apache Kafka 3.0,生产者默认启用最强的交付保证(acks=allenable.idempotence=true)。这意味着用户现在默认获得排序和持久性。


"Will having idempotence slow down my endpoint? (This endpoint needs to be really fast)"

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

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

"I read the kafka api doc, that enabling idempotence will make the retries infinite (what ?)"

根据配置的描述enable.idempotence它说:“当设置为'true'时,生产者将确保每条消息的副本恰好写入stream。如果'false',producer由于broker故障等原因重试,可能会在stream中写入重试消息的副本。注意开启幂等性需要max.in.flight.requests.per.connection小于等于5,retries 必须大于 0 并且 acks 必须是 'all'。如果用户没有明确设置这些值,将选择合适的值。如果设置了不兼容的值,将抛出 ConfigException抛出。"

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

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

"Do I really need idempotence if i am not using it with transactions ?"

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

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