我想保证使用SinkTask
保存数据时的写入顺序。
如果我想在SinkTask.put()
期间抛出一个RetriableException,那么Kafka Connect
将无法写入数据源 乱序 而不是分区中的订单?
例如,如果分区中的消息是1-2-3,如果在写入Message-2期间发生异常,Kafka Connect是否可以保证到达数据源的消息是1-2-3?
据我所知,Kafka Connect写入数据源 异步 。因此,数据似乎无法按顺序到达数据源。
答案 0 :(得分:1)
简短回答:是的,邮件的顺序将被保留,但您必须处理邮件的重新传递。
在您的示例中,这意味着,如果 SinkTask.put 尝试向您的接收器传递以下一批消息:1,2,3并在写入1之后和写入2之前通过抛出 RetriableException ,Connect将暂停使用者并尝试重新传递在调用 SinkTask.put 期间失败的批处理。这给了我们前面提到的两个效果:
a)Connect将暂停此任务/分区的使用者。这意味着在重试失败的消息之前不会传递任何其他批消息。因此,保留了消息顺序。例如。如果使用 RetriableException 交付1,2,3失败,Connect在交付1,2,3之前将不会交付4,5,6。
b)Connect将重试以传递 SinkTask.put 期间失败的整个消息集。这意味着在您尝试再次写入消息2之前,您的接收器将再次看到消息1。