Документация к соединителю приемника S3 - это еще один хороший ресурс, в котором описывается, как соединитель может гарантировать точную однократную доставку на S3, и, что более важно, какая комбинация функций обеспечивает (или не обеспечивает) эту гарантию.
В частности, один из разделов этого документа гласит:
Чтобы гарантировать семантику с точностью до однократного с TimeBasedPartitioner
, соединитель должен быть настроен на использование детерминированной реализации c TimestampExtractor
и детерминированная c стратегия ротации. Определителями c меток времени являются записи Кафки (timestamp.extractor=Record
) или поля записей (timestamp.extractor=RecordField
). Детерминированная c конфигурация стратегии вращения имеет значение rotate.interval.ms
(настройка rotate.schedule.interval.ms
является недетерминированной c и приведет к аннулированию только одноразовых гарантий).
Ваша конфигурация соединителя приемника S3 действительно использует детерминированность c разделитель (через «partitioner.class»: «io.confluent.connect.storage.partitioner.TimeBasedPartitioner»), но он использует недетерминированный c экстрактор отметки времени Wallclock (через "timestamp.extractor": "Wallclock"
). Это не определено c, потому что, если соединитель должен перезапускаться (например, из-за сбоя) и повторно обрабатывает определенную запись, он будет повторно обрабатывать эту запись позднее, и средство извлечения метки времени настенного тактового генератора выберет другое время для эта запись.
Во-вторых, ваш соединитель использует параметр rotate.schedule.interval.ms
, который в документации отмечается как несовместимый с единовременной доставкой. Например, если соединителю нужно повторно обработать серию записей Kafka, он может разбить записи на объекты S3, отличные от первого раза, и это означает, что соединитель S3 заканчивает записывать разные объекты S3.
In Таким образом, коннектор приемника S3 с вашей конфигурацией не предоставит ровно один раз гарантии доставки.