【问题标题】:Kafka - Message Ordering GuaranteesKafka - 消息排序保证
【发布时间】:2020-09-02 01:39:04
【问题描述】:

我遇到了两个关于排序的短语,

  1. 生产者发送到特定主题分区的消息将被 按发送顺序附加。也就是说,如果发送了一条记录 M1 由与记录 M2 相同的生产者发送,首先发送 M1,然后发送 M1 将具有比 M2 更低的偏移量并在日志中更早出现。

另一个

  1. (config param) max.in.flight.requests.per.connection - 最大数量 客户端将在单个连接上发送的未确认请求 在阻塞之前。 请注意,如果此设置设置为大于 1 并且有失败的发送,有消息重新排序的风险 由于重试(即,如果启用重试)。

问题是,如果像提到的 #2 那样发送失败,订单是否仍会保留到特定分区?如果一条消息存在潜在问题,则以下所有消息将被丢弃“以保留每个分区的顺序”,或者将发送“正确”消息并将失败的消息通知给应用程序?

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    “如果像提到的 #2 那样发送失败,订单是否仍会保留到特定分区?”

    正如您复制的文档部分所述,存在更改顺序的风险。

    想象一下,您有一个主题,例如一个分区。您将retries 设置为100,将max.in.flight.requests.per.connection 设置为大于一的5。请注意,仅当您将 acks 设置为 1 或“全部”时,重试才有意义。

    如果您计划按 K1、K2、K3、K4、K5 的顺序生成以下消息,并且您的生产者需要一些时间来

    • 实际创建批处理并
    • 向代理提出请求并
    • 等待经纪人确认

    最多可以并行处理 5 个请求(基于 max.in.flight.request.per.connection 的设置)。现在,生成“K3”有一些问题,它进入了重试循环,可以生成消息 K4 和 K5,因为请求已经在进行中。

    您的主题最终会按以下顺序显示消息:K1、K2、K4、K5、K3。

    如果您在 Kafka Producer 中启用 idempotency,则仍然可以保证排序,如Ordering guarantees when using idempotent Kafka Producer中所述

    【讨论】:

    • hmm,这意味着“所说的”声明在所有方面都不是很好,这有点与声明相矛盾 - “在高级卡夫卡给出以下保证”也许有一些术语和应用条件。
    • 呵呵,真的 :) 我认为魔鬼在“按照他们发送的顺序”的部分。 “Sent”这里的意思是:批处理,发送到broker,等待broker的确认,读起来不明显……尤其是max.in.flight.requests.per.connection的默认值其实是5。
    • 也许值得一提的幂等性?
    猜你喜欢
    • 2022-01-23
    • 2023-02-20
    • 2020-03-04
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多