со спринг бутом.
Мой consumer читает сообщения из кафки, обрабатывает их, коммитит, тем самым сдвигая офсет. Но что происходит если случается ошибка в процессе обработки? На практике я увидел что офвсет все равно смещается. Почитал, погуглил, вроде бы есть даже флажок, который по умолчанию true и разрешает коммитить даже если был ексепешн. Вроде бы так и работает. Но вот непонятно, сообщения которые были закоммичены как либо отличаются в кафке от тех которые были закоммиччены успешно? Я пока не нашел, и подозреваю что нет, не отличаются. так ли это?
Допустим они не отличаются от тех что были успешно обработвны, тогда второй вопрос - какие существуют практики по переотправке неуспешных сообщений? сместить офсет назат? - тогда в очередь попадут и те, что были успешно обработаны. складывать ошибочные в другую очередь? вручную? может есть что из коробки? другие варианты?
могу ошибаться но: 1. если обернуть в ConcurrentMessageListenerContainer то можно использовать RetryingMessageListenerAdapter для ретраев обработки сообщения. 2. ретрай делается в случае явного выкидывания exception из onMEssage 3. количество ретраев натсраивается у RetryingMessageListenerAdapter там же можно настроить обработку при последнем ретрае-эксепшене. офсет заомичен не будет. 4. надо понимать что если 5 сообщерний напромер прогнало через ретраи и все не закомитило, а 6е сообшение обработано успешно то коммит его офсета выставит лаг в 0
Обсуждают сегодня