Spring Kafka Consumer Retry

Я использую потребитель Spring Kafka, который извлекает сообщения из темы и сохраняет их в базе данных. Если выполняется условие сбоя, например, база данных недоступна, предоставляет ли потребительская библиотека kafka механизм для повторной попытки? Если это так, есть ли способ установить разные интервалы повтора, например, 1-й повтор должен быть выполнен через 5 минут, 2-й через 30 минут, 3-й через 1 час и т. Д.


person Punter Vicky    schedule 02.10.2017    source источник


Ответы (1)


Spring Kafka поставляется с RetryingMessageListenerAdapter и RetryingAcknowledgingMessageListenerAdapter. Если вы используете @KafkaListener, вы можете поставить AbstractKafkaListenerContainerFactory с RetryTemplate. И последний может быть введен любыми пользовательскими RetryPolicy и BackOffPolicy из проекта Spring Retry:

https://docs.spring.io/spring-kafka/reference/html/#retrying-deliveries

Также имейте в виду, что, начиная с версии 2.0, в Spring Kafka есть поддержка транзакций, основанная на такой поддержке в Apache Kafka 0.11.x.x:

https://docs.spring.io/spring-kafka/reference/html/#transactions

person Artem Bilan    schedule 02.10.2017
comment
Спасибо, Артем, когда у меня 10 смещений скажем в разделе. Если сообщение со смещением 5 не может быть вставлено в БД, будет ли это попытаться на основе конфигурации повтора, которую я установил, в то время как смещения с 6 по 10 продолжают выполняться как часть обычного процесса? или потребитель будет ждать, пока 5 будет успешно завершено? Я предполагаю, что сообщение не будет зафиксировано для смещения 5, пока попытки повторных попыток не будут исчерпаны - person Punter Vicky; 02.10.2017
comment
Это правильно. Записи в одном разделе обрабатываются последовательно, поэтому 6 не будет обрабатываться, пока 5 не будет успешным или не будет исчерпан при повторной попытке. - person Artem Bilan; 02.10.2017
comment
Спасибо, последний вопрос. Могу ли я включить повторную попытку только для определенных типов ошибок? - person Punter Vicky; 02.10.2017
comment
Да, ты можешь. Это RetryPolicy ответственность. См. Его JavaDocs и реализации. - person Artem Bilan; 02.10.2017