【发布时间】:2021-03-04 11:17:59
【问题描述】:
我在休息端点调用中有 启用幂等性(没有启用一次语义或事务)的 kafka 生产者。我启用它的原因是因为我不希望 kafka 重试导致任何重复。我担心以下问题:
- 幂等性会减慢我的端点吗? (这个端点需要非常快)
- 我阅读了 kafka api 文档,启用幂等性将使重试无限(什么?)
- 如果我不将幂等性用于事务,我真的需要幂等性吗?
【问题讨论】:
标签: apache-kafka kafka-producer-api
我在休息端点调用中有 启用幂等性(没有启用一次语义或事务)的 kafka 生产者。我启用它的原因是因为我不希望 kafka 重试导致任何重复。我担心以下问题:
【问题讨论】:
标签: apache-kafka kafka-producer-api
Apache Kafka 3.0 更新
根据Announcement of Apache Kafka 3.0,生产者默认启用最强的交付保证(acks=all,enable.idempotence=true)。这意味着用户现在默认获得排序和持久性。
“具有幂等性会减慢我的端点吗?(这个端点需要非常快)”
Kafka 允许使用内部序列号来幂等地生成消息。这是在代理端缓存和比较的,因此生成消息会更耗时。此外,尽管您可以有多个正在执行的写入请求,但如果一个失败,随后的少数几个请求将失败并出现可重试的 OutOfSequenceException,这也可能会减慢您的生产者的速度。
但是,与禁用幂等性的生产者相比,这两个确实是微不足道的补充,我不知道有任何综合基准来衡量吞吐量或延迟的差异。最好在您的实际环境中进行测试。
“我阅读了 kafka api 文档,启用幂等性将使重试无限(什么?)”
根据配置enable.idempotence的描述它说:“当设置为'true'时,生产者将确保每条消息的副本都写入流中。如果'false',生产者由于broker失败等重试,可能会在流中写入重试消息的重复,注意开启幂等需要max.in.flight.requests.per.connection小于等于5,retries大于0,acks必须是'all'。如果用户没有明确设置这些值,将选择合适的值。如果设置了不兼容的值,将抛出一个ConfigException。"
请记住,重试的默认值无论如何都是2147483647(我认为是无限)。随意将此值设置为较小的数字,但仍大于 0。
关于幂等 KafkaProducer 的排序保证,即使有多个正在进行的请求,我已经写了一个答案here。
“如果我不将幂等性用于事务,我真的需要幂等性吗?”
我无法说出您的要求是什么,但在生产者端启用幂等性可确保不会因代理或生产者故障而创建重复。
请记住,Kafka 中的事务有两个方面,不仅是生产者,还有消费者。如果您使用事务,您还想查看您的消费者配置isolation.level。
【讨论】: