Estou usando o Spring Kafka 3.0.5 com o KafkaTransactionManager e o DefaultErrorHandler.
Na minha configuração de consumidor:
O modo de confirmação está definido como LOTE
O tipo de ouvinte é @KafkaListener (baseado em registro)
As transações estão habilitadas (KafkaTransactionManager)
A nova tentativa é configurada com DefaultErrorHandler.setRetryListeners(...) e 10 novas tentativas
Ao testar com um lote de mensagens, observei o seguinte:
Se o último registro em um lote pesquisado falhar, toda a transação será revertida e o deslocamento não será confirmado — como esperado.
Se o último registro for bem-sucedido, mesmo que os registros anteriores no lote tenham falhado, mas tentado novamente com sucesso, a transação inteira será confirmada e o atraso do consumidor se tornará 0.
Isso significa que o resultado final do último registro no lote parece determinar se a transação foi confirmada ou não.
Questões:
Esse comportamento é esperado — que o resultado do último registro decida a confirmação da transação?
Isso está documentado em algum lugar no Spring Kafka ou no próprio comportamento transacional do Kafka?
Existe uma maneira de tornar a confirmação da transação mais explícita por registro ou dissociá-la do status final do registro?
Qualquer esclarecimento ou links de documentação seriam muito apreciados.