【问题标题】:Can Kafka Connect guarantee the write order when RetriableException occurs?发生 RetriableException 时,Kafka Connect 能否保证写入顺序?
【发布时间】:2017-09-16 10:40:00
【问题描述】:

我想在使用SinkTask 保存数据时保证写入顺序。

如果我想在SinkTask.put() 期间抛出 RetriableException,Kafka Connect 写入数据源会乱序而不是分区中的顺序吗?

比如一个partition中的消息是1-2-3,如果写Message-2的时候出现异常,Kafka Connect能否保证消息到达数据源是1-2-3?

据我所知,Kafka Connect 异步写入数据源。所以看起来数据会乱序到达数据源。

【问题讨论】:

    标签: apache-kafka apache-kafka-connect


    【解决方案1】:

    简短回答:是的,消息的顺序将被保留,但您必须处理消息的重新传递。

    在您的示例中,这意味着,如果 SinkTask.put 尝试将以下一批消息传递到您的接收器:1,2,3 并且在写入 1 之后和写入 2 之前通过抛出RetriableException,Connect 将暂停消费者并尝试重新交付在调用 SinkTask.put 期间失败的批处理。这给了我们前面提到的两个效果:

    a) Connect 将暂停此任务/分区的消费者。这意味着在重试失败的消息之前不会传递其他批次的消息。因此,消息顺序被保留。例如。如果交付 1,2,3 失败并出现 RetriableException,Connect 将不会在交付 1,2,3 之前交付 4,5,6。

    b) Connect 将重试传递在 SinkTask.put 期间失败的整个消息集。这意味着您的接收器将在第二次尝试写入消息 2 之前再次看到消息 1。

    【讨论】:

    • 完美。不过,我不太明白您所说的 “您将不得不处理重新发送消息” 的意思,因为您提到 Connect 将自动发送消息。这是否意味着,正在写入的数据源必须处理在故障期间写入的重复消息?例如,在您的 b) 示例中,数据源需要正确处理再次写入的消息 1?
    • 对。我基于你最初的例子。您提到在编写 Message-2 期间发生异常,这意味着 msg1 已被 Sink 正确“处理”(例如,它已写入文件)。从 Sink 抛出 RetriableException 时,这意味着您可以重新应用批处理的处理(您的 sink 是幂等的),或者您不关心重复。在文件示例中,这意味着您可以重新附加仅使用消息 1 部分写入的文件,以包含现在的消息 1,2 和 3 或解决重复项。 Connect 重新交付整个批次。
    • 感谢您的有益回复和对 Kafka 的贡献!
    • 感谢@KonstantineKarantasis 的回复。如果我们从put() 中抛出RetriableException 以获得一批记录,Kafka-connect 是再次将这些记录发送到put() 方法,还是只是重试批处理而不将记录发送到 put()?例如如果我们计算put() 中的记录数并且批处理因 RetriableException 而失败,这些记录会被计算两次还是一次?我的理解是它会计算两次,如果这是正确的,请告诉我。
    猜你喜欢
    • 2021-11-23
    • 2021-11-26
    • 2021-10-04
    • 2016-05-17
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2011-02-08
    • 2010-11-05
    相关资源
    最近更新 更多