理解kafka producer的max.inflight属性

Understanding the max.inflight property of kafka producer

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

在我的工作台中,我的部分工作人员专注于在保证排序且无数据丢失的情况下可能的最大吞吐量(只有一个分区的主题),我需要将 max.in.flight.requests.per.connection 属性 设置为 1?

我读过this article

我知道如果我使用 retries 属性.

在我的生产者处启用重试功能,我只需要将 max.in.flight 设置为 1

另一种方式问我的问题:只有一个partition + retries=0 (producer props) 是否足以保证在Kafka中的顺序?

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

您的用例有点不清楚。您提到订购并且没有数据丢失,但没有指定您是否容忍重复消息。所以如果你想要至少一次(QoS 1)或恰好一次

是不干净的

无论哪种方式,由于您使用的是 1.0.0 且仅使用单个分区,因此您应该查看幂等生产者而不是调整生产者配置。它允许正确有效地保证排序并且没有数据丢失。

来自文档:

Idempotent delivery ensures that messages are delivered exactly once to a particular topic partition during the lifetime of a single producer.

早期的幂等生产者强制 max.in.flight.requests.per.connection 为 1(出于与您提到的相同的原因),但在最新版本中,它现在可以与 max.in.flight.requests.per.connection 设置为最多 5 并仍然保持它的保证。

使用幂等生产者,您不仅可以获得更强大的交付语义(恰好一次而不是至少一次),而且它甚至可能表现得更好!

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

回到你的问题

是的,没有幂等(或事务性)生产者,如果你想避免数据丢失(QoS 1)并保持顺序,你必须将 max.in.flight.requests.per.connection 设置为 1,允许 retries 并使用acks=all。如您所见,这是以显着的性能成本为代价的。

是的,您必须将 max.in.flight.requests.per.connection 属性 设置为 1。 在您阅读的文章中,作者写道:

max.in.flights.requests.per.session

Kafka 文档中不存在。

此勘误表可能来自书 "Kafka The Definitive Guide"(第 1 版),您可以在其中阅读第 52 页:

<...so if guaranteeing order is critical, we recommend setting in.flight.requests.per.session=1 to make sure that while a batch of messages is retrying, additional messages will not be sent ...>