Не существует такого понятия, как идемпотентный (ровно один раз) потребитель с Кафкой.
Кафка действительно обеспечивает семантику ровно один раз для
kafkaRead -> process -> kafkaWrite
Но " ровно один раз »относится только ко всему потоку. Шаг process
равен at least once
.
Другими словами, смещение для чтения фиксируется только в случае успешной записи. Если запись не удалась, чтение / обработка / запись будет выполнена снова.
Это реализовано с использованием транзакций Кафки .
Если вы взаимодействуете с каким-либо другим хранилищем в шаг process
(или вообще не выполняет запись kafka - kafkaRead -> process
), вы должны написать свой собственный идемпотентный (дедупликационный) код.
Но это относительно просто, потому что запись потребителя имеет уникальный ключ через topic/partition/offset
- просто сохраните данные с данными и убедитесь, что вы еще не обработали эту запись.
Kafka поддерживает идемпотентных продуцентов.