Можем ли мы иметь однократную обработку с помощью Spring kafka?

Я пытаюсь потреблять Kafka Consumer ровно один раз.
Мое требование:

  1. Чтение данных из темы
  2. Обработать данные [что включает в себя вызов другого API]
  3. Написание ответа Кафке

Я хотел знать, возможен ли ровно один раз в этом сценарии?

Я знаю, что этот вариант использования удовлетворяет API потоков Kafka, но я хотел узнать от API производителя/потребителя? Кроме того, если допустим, что после обработки данных потребитель по какой-то причине выходит из строя (обработка должна выполняться только один раз), как лучше всего обрабатывать такие случаи? Может ли быть какое-то продолжение/контрольная точка для таких случаев?

Я понимаю, что API Kafka Streams является транзакционным «производство-потребитель-производство». Здесь также, если после вызова API-потребителя произошел сбой, поток запустился бы с самого начала, верно?

Отвечает ли это на ваш вопрос? Кафка только один раз гарантия потребления

pringi 09.05.2022 17:38

Я прошел по этой ссылке выше. Это говорит о сохранении идентификатора сообщения в каком-то внешнем хранилище; проблема с этим в том, что даже если мы сохраним и обработаем сбой, то его следует повторить, но этого не произойдет.

Raghav 09.05.2022 17:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да; 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], то это невозможно?

Raghav 09.05.2022 18:33

Это невозможно; вы не узнаете, произошел ли сбой процесса до или после вызова API. Это верно и для Kafka Streams; это распространенное заблуждение, что термин «ровно один раз» применяется только ко всей последовательности — вся последовательность успешно завершена ровно один раз, но процесс потребления и потребления + выполняется по крайней мере один раз.

Gary Russell 09.05.2022 18:51

Обычный метод заключается в том, чтобы сохранить тему/раздел/смещение записи в БД, если часть процесса прошла успешно, и пропустить ее во время повторной доставки. Но все еще есть место для ошибки (например, вызов API был успешным, но сохранение смещения не было).

Gary Russell 09.05.2022 18:53

Ах понял! Спасибо Гэри! У меня был еще один вопрос, stackoverflow.com/questions/72202595/…. Не могли бы вы помочь и в этом?

Raghav 11.05.2022 16:13

Другие вопросы по теме