Я пытаюсь потреблять Kafka Consumer ровно один раз.
Мое требование:
Я хотел знать, возможен ли ровно один раз в этом сценарии?
Я знаю, что этот вариант использования удовлетворяет API потоков Kafka, но я хотел узнать от API производителя/потребителя? Кроме того, если допустим, что после обработки данных потребитель по какой-то причине выходит из строя (обработка должна выполняться только один раз), как лучше всего обрабатывать такие случаи? Может ли быть какое-то продолжение/контрольная точка для таких случаев?
Я понимаю, что API Kafka Streams является транзакционным «производство-потребитель-производство». Здесь также, если после вызова API-потребителя произошел сбой, поток запустился бы с самого начала, верно?
Я прошел по этой ссылке выше. Это говорит о сохранении идентификатора сообщения в каком-то внешнем хранилище; проблема с этим в том, что даже если мы сохраним и обработаем сбой, то его следует повторить, но этого не произойдет.
Да; Spring для Apache Kafka поддерживает семантику ровно один раз так же, как Kafka Streams.
Видеть
https://docs.spring.io/spring-kafka/docs/current/reference/html/#exactly-once
и
https://docs.spring.io/spring-kafka/docs/current/reference/html/#transactions
Имейте в виду, что «ровно один раз» означает, что весь успешный
потреблять -> обрабатывать -> производить
выполняется один раз. Но если шаг produce
завершается неудачно (откат транзакции), то часть consume -> process
выполняется «хотя бы один раз».
Следовательно, вам нужно сделать часть process
идемпотентной.
То есть, если я правильно понимаю, если мы ошибемся на этапе обработки, потребитель снова будет потреблять то же сообщение? так что, если я хочу иметь ровно один раз в сценарии чтения-> процесса [у меня нет контроля над внешним вызовом API], то это невозможно?
Это невозможно; вы не узнаете, произошел ли сбой процесса до или после вызова API. Это верно и для Kafka Streams; это распространенное заблуждение, что термин «ровно один раз» применяется только ко всей последовательности — вся последовательность успешно завершена ровно один раз, но процесс потребления и потребления + выполняется по крайней мере один раз.
Обычный метод заключается в том, чтобы сохранить тему/раздел/смещение записи в БД, если часть процесса прошла успешно, и пропустить ее во время повторной доставки. Но все еще есть место для ошибки (например, вызов API был успешным, но сохранение смещения не было).
Ах понял! Спасибо Гэри! У меня был еще один вопрос, stackoverflow.com/questions/72202595/…. Не могли бы вы помочь и в этом?
Отвечает ли это на ваш вопрос? Кафка только один раз гарантия потребления