Избегайте отправки повторяющихся сообщений КАФКЕ в случае сбоя приложения

#java #spring-boot #apache-kafka #spring-kafka #kafka-producer-api

Вопрос:

Эта конечная точка отдыха вызывается каждые 1 час.Как я могу избежать отправки дубликатов данных Кафке?

 http://localhost:8080/sendData
 

Вызов конечной точки Rest выполняет следующие 4 операции

    1. Вызывает процедуру для получения данных (допустим, процедура возвращает 100 сообщений)
  1. 70 сообщений, отправленных Кафке .Внезапно мое приложение выходит из строя
  2. Затем отправить остальные 30 сообщений .Я снова вызываю процедуру, которая снова возвращает 100 сообщений .
  3. таким образом, 70 сообщений дублируются . //необходимо избегать

1 решение иметь флаг have(например, IS_SENT_TO_KAFKA) в базе данных для каждого сообщения(строки) . И обновите этот флаг до IS_SENT_TO_KAFKA= «Y», если сообщение было передано КАФКЕ, и IS_SENT_TO_KAFKA= «N», если сообщение не было отправлено КАФКЕ

Но у приведенного выше решения есть и один недостаток .Что делать, если приложение выйдет из строя при обновлении ФЛАГА.Тогда также у нас будет 1 дублирующее сообщение

KafkaTemplate.отправить(имя темы, сообщение);

обратный вызов onSuccess() — saveInDB (‘Y’) ;IS_SENT_TO_KAFKA=’Y’ обратный вызов OnFailure() — saveInDB (‘N’) ;IS_SENT_TO_KAFKA=’N’

Комментарии:

1. Смотрите @TRansactional и другие примеры в этом документе. Двумя словами, да: вы можете охватить обе операции в одной транзакции.

2. Ha! Если бы это было финансовое, я бы определенно пересмотрел свое мнение о транзакциях…

3. Правильный. Это один из способов передать некоторую информацию, чтобы Идемпотентный получатель знал, дублируется сообщение или нет. Эта RecordFilterStrategy стратегия может проконсультироваться с каким-либо хранилищем, было ли сообщение обработано ранее или нет. У нас есть хорошая реализация в весенней интеграции: docs.spring.io/spring-integration/docs/current/reference/html/… , но это уже другая история и далеко выходит за рамки этого вопроса. Хотя я бы рассмотрел доступные инструменты в Интернете, когда буду разрабатывать свой проект

4. Я не очень хорошо разбираюсь в транзакциях Кафки, но то, что вы говорите, имеет смысл и соответствует документам, которые я упомянул о поддержке транзакций весной для Apache Kafka.

5. @ArtemBilan действительно полезные справочные документы… Я не знал, что у Весны есть его реализация.