Как указано @Matthias, ровно одна семантика работает только с потоками Kafka для приложения типа потоков Kafka, интеграция с внешней системой может нарушить семантику. Вы можете прочитать больше об этом в этой статье.
Я бы посоветовал вам использовать Kafka Consumer API, поскольку он обеспечит наилучший баланс между гибкостью и абстракцией для вашего варианта использования. Все, что вам нужно сделать, это удалить enable.auto.commit = false и зафиксировать вручную после успешной записи пакета во внешнюю систему с помощью consumer.commitSync ();
Обеспечение ровно одного раза может быть немного сложным, иногда в зависимости от вашего варианта использования. Вам нужно убедиться, что ваш потребитель является идемпотентом, используя собственную логику. Вы можете рассмотреть возможность использования внешнего постоянного хранилища для хранения хеша (или ключа, если он уникален) сообщений и проверки для каждого сообщения, если оно еще не обработано. Вы также можете использовать хранилище состояний для этой цели, но я чувствовал, что очистка хранилища состояний иногда становится проблемой, но это во многом зависит от вашего варианта использования.
Вы можете проверить эту статью, если это поможет.