【问题标题】:Understanding the max.inflight property of kafka producer了解 kafka producer 的 max.inflight 属性
【发布时间】:2018-09-22 23:15:06
【问题描述】:

我在 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 会大大增加吞吐量。

【问题讨论】:

  • 如果您在底部看到 cmets ,您将看到从 max.in.flight.requests.per.connectionmax.in.flight.requests.per.session 的更正

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


【解决方案1】:

您的用例有点不清楚。您提到了排序并且没有数据丢失,但没有指定是否允许重复消息。因此,如果您想要至少一次(QoS 1)或恰好一次

,那是不干净的

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

来自文档:

幂等传递确保消息只传递一次 在单个的生命周期内到特定的主题分区 制片人。

早期的 Idempotent Producer 将 max.in.flight.requests.per.connection 强制为 1(出于与您提到的相同的原因),但在最新版本中,它现在可以与将 max.in.flight.requests.per.connection 设置为 5 一起使用,并且仍然保持其保证。

使用 Idempotent Producer,您不仅可以获得更强大的交付语义(Exactly Once 而不是 At least Once),而且性能甚至可能更好!

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

回到你的问题

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

【讨论】:

  • 如果您想保留消息顺序,我不确定您是否可以将 max.in.flight.requests.per.connection 设置为 5。如果一条消息被拒绝并需要重试,但在中途第二条消息已发送并写入主题,则第一条消息将在第二条消息之后写入主题中。为避免这种情况,您只能有一条消息在发送中。我知道如果您只想要精确一次交付,您可以将此属性设置为 5
  • @PabloAntequera :我不知道以前的版本,但是对于最新版本的 Kafka,enable.idempotence=true 可以防止复制并保持消息的顺序,即使 max.in.flight.requests .per.connection > 1.解释在这里:docs.confluent.io/cloud/current/client-apps/optimizing/…
  • 每个连接发送到不同分区时是否保持发送顺序?我的意思是,如果一个发送失败,是否有可能后面的消息会成功。
【解决方案2】:

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

max.in.flights.requests.per.session

Kafka 文档中不存在。

这个勘误可能来自“Kafka The Definitive Guide”(第 1 版)一书,您可以在第 52 页阅读:

<...>in.flight.requests.per.session=1 确保在一批 消息正在重试,其他消息将不会发送...>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2020-12-17
    • 2023-02-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多