【问题标题】:How does kafka handle ordering of different batch?kafka如何处理不同批次的订购?
【发布时间】:2021-01-21 02:08:19
【问题描述】:

在 kafka 关于重试的文档中,它说:

在不将 max.in.flight.requests.per.connection 设置为 1 的情况下允许重试可能会改变记录的顺序,因为如果将两个批次发送到单个分区,并且第一个批次失败并被重试,但第二个批次成功,那么第二批的记录可能会首先出现。

根据段落,如果两个批次被发送到同一个分区,kafka 可以提交第二批,而第一批失败。
但这似乎与 kafka 关于在同一分区中排序的保证相矛盾。因为通常如果一个批次失败了,后面的所有批次都应该失败,否则如何保证订购?另外,kafka如何保证producer发送的批次顺序和broker收到的顺序一致。

所以我的问题是:kafka 如何保证不同批次(同一分区)的排序,或者它只是不保证。

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    kafka如何保证不同批次(同一分区)的排序,或者它只是不保证。

    确实通过设置来保证分区内的顺序

    • retries=0
    • retries>0max.in.flight.requests.per.connection=1

    如果将重试次数增加到大于 0 的数字,则配置 max.in.flight.requests.per.connection 生效,默认为 5in-flight 请求意味着,最多可以有 5 个生产者请求尚未被代理确认。

    如文档中引用的段落所述,这可能意味着您的批次 B1、B2、B3、B4、B5 都可以并行发送。如果发送 B3 失败并且您的重试次数 > 0,那么它可能会在 B5 之后写入代理。

    【讨论】:

    • 但是默认重试次数不是0,是Integer.MAX_VALUE
    • 你是对的,默认是最大整数。但是,答案保持不变。只有 retries=0 或 retries >0 且 max.inflight.requests.per.connection=1 才能保证排序。
    • 感谢您指出。我正在检查 Kafka 2.0 的默认重试配置。显然他们在以后的版本中更改了默认设置。我已经相应地更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2019-12-15
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多