#apache-kafka #spring-kafka
Вопрос:
Я имею в виду:
https://medium.com/trendyol-tech/how-to-implement-retry-logic-with-spring-kafka-710b51501ce2
И это говорит о том, что если мы используем ниже:
factory.setErrorHandler(new SeekToCurrentErrorHandler(new DeadLetterPublishingRecoverer(kafkaTemplate), 3));
Он заблокирует основного потребителя во время ожидания повторной попытки. (https://medium.com/trendyol-tech/how-to-implement-retry-logic-with-spring-kafka-710b51501ce2#:~:text=Also it blocks the main consumer while its waiting for the retry)
Итак, мой вопрос в том, действительно ли нам нужно повторить попытку в основной теме или мы можем переместить неудачные сообщения в тему повторной попытки, а затем обработать сообщения там, чтобы наша основная тема не блокировалась.
Можем ли мы добиться неблокирующей повторной попытки с помощью STCH?
Ответ №1:
Неблокирующие повторные попытки были недавно добавлены в новую версию 2.7.
https://docs.spring.io/spring-kafka/docs/current/reference/html/#retry-topic
Для достижения неблокирующей функции повтора / dlt с помощью Kafka обычно требуется настройка дополнительных тем, а также создание и настройка соответствующих прослушивателей. Начиная с версии 2.7 Spring для Apache Kafka предлагает поддержку этого с помощью
@RetryableTopic
класса аннотации и конфигурации Retrytopic для упрощения начальной загрузки.
Если обработка сообщения завершается неудачно, сообщение пересылается в тему повторной попытки с отметкой времени возврата. Затем потребитель темы повторной попытки проверяет метку времени, и если это не требуется, он приостанавливает потребление для раздела этой темы. Когда это произойдет, потребление разделов возобновится, и сообщение будет использовано снова. Если обработка сообщения снова завершится неудачно, сообщение будет перенаправлено в следующую тему повторной попытки, и шаблон будет повторяться до тех пор, пока не произойдет успешная обработка или попытки не будут исчерпаны, и сообщение будет отправлено в тему «Мертвая буква» (если настроено).