#java #spring-boot #apache-kafka #spring-kafka #kafka-producer-api
Вопрос:
Эта конечная точка отдыха вызывается каждые 1 час.Как я могу избежать отправки дубликатов данных Кафке?
http://localhost:8080/sendData
Вызов конечной точки Rest выполняет следующие 4 операции
-
- Вызывает процедуру для получения данных (допустим, процедура возвращает 100 сообщений)
- 70 сообщений, отправленных Кафке .Внезапно мое приложение выходит из строя
- Затем отправить остальные 30 сообщений .Я снова вызываю процедуру, которая снова возвращает 100 сообщений .
- таким образом, 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 действительно полезные справочные документы… Я не знал, что у Весны есть его реализация.