了解kafka生产者的max.inflight属性

时间:2018-04-12 17:29:26

标签: configuration apache-kafka kafka-producer-api producer

我在1.0.0-cp1版本的Kafka集群的工作台上工作。

在我的工作室的一部分,他们专注于订购保证和没有数据丢失的最大吞吐量(只有一个分区的主题),我需要将max.in.flight.requests.per.connection属性设置为1吗?

我已阅读this article

我明白,如果我使用retries属性在我的制作人处启用重试功能,我只需要将max.in.flight设置为1。

另一种问我问题的方法:只有一个分区+ retries = 0(生产者道具)足以保证Kafka的订购?

我需要知道,因为增加max.in.flight会大大增加吞吐量。

2 个答案:

答案 0 :(得分:9)

您的用例有点不清楚。您提到了排序,没有数据丢失,但没有指定您是否容忍重复的消息。如果你想要至少一次(QoS 1)或者完全一次

那么这是不洁净的

无论哪种方式,当您使用1.0.0并且仅使用单个分区时,您应该查看Idempotent Producer而不是调整Producer配置。它允许正确有效地保证订购并且不会丢失数据。

来自文档:

  

幂等传递确保消息只传送一次   在单个生命周期内的特定主题分区   生产者。

早期的幂等制作人强迫max.in.flight.requests.per.connection为1(出于你提到的相同原因),但在最新版本中,它现在可以与max.in.flight.requests.per.connection一起使用,最多可设置为5并保持其保证

使用Idempotent Producer,您不仅可以获得更强的传递语义(完全一次而不是至少一次),但它甚至可能表现更好!

我建议您检查传递语义in the docs

回到你的问题

没有幂等(或事务)生成器,如果您想避免数据丢失(QoS 1)并保留排序,则必须将max.in.flight.requests.per.connection设置为1,允许retries并使用{{ 1}}。如您所见,这会带来显着的性能成本。

答案 1 :(得分:2)

是的,您必须将max.in.flight.requests.per.connection属性设置为1。 在您已阅读的文章中,这是作者写的一个初始错误(当前已纠正):

  

最大航班数/每次会话

在Kafka文档中不存在。

此勘误可能来自《 卡夫卡权威指南》(第一版)一书,您可以在第52页中阅读该书:

  

<...因此,如果保证订单的要求很严格,我们建议设置   in.flight.requests.per.session=1,以确保   邮件正在重试,其他邮件将不会发送...>