我想保证使用SinkTask
保存数据时的写入顺序。
如果我想在SinkTask.put()
期间抛出一个可尝试的异常,Kafka Connect
写入数据源的顺序会比分区中的顺序不合吗?
例如,如果分区中的消息为 1-2-3,如果在写入消息 2 时发生异常,Kafka Connect 能否保证到达数据源的消息为 1-2-3?
据我所知,Kafka Connect异步写入数据源。因此,数据似乎会无序地到达数据源。
简短回答:是的,消息的顺序将被保留,但您必须处理消息的重新传递。
在您的示例中,这意味着,如果 SinkTask.put 尝试将以下一批消息传递到接收器:1、2、3,并且在写入 1 之后和写入 2 之前通过引发RetryableException失败,Connect 将暂停使用者,并尝试重新传递在调用SinkTask.put期间失败的批处理。这给了我们上述两个效果:
a) 连接将暂停此任务/分区的使用者。这意味着在重试失败的消息之前,不会传递其他一批消息。因此,将保留消息顺序。例如,如果交付 1,2,3 失败并出现RetryableException,则 Connect 在交付 1,2,3 之前不会交付 4,5,6。
b) Connect 将重试传递在SinkTask.put期间失败的整个消息集。这意味着接收器在尝试第二次写入消息 2 之前将再次看到消息 1。