Согласно документации commitTransaction
Кафки, commitTransaction
потерпит неудачу с TimeoutException
, если не получит ответ в определенное время
Обратите внимание, что этот метод вызовет TimeoutException, если транзакция не может быть совершено до истечения срока действия max.block.ms. Кроме того, он вызовет InterruptException в случае прерывания. Повторить попытку безопасно в любом случае, но невозможно выполнить другую операцию (например, abortTransaction), поскольку фиксация уже может быть завершена. Если не повторить попытку, единственный вариант - закрыть производителя.
Рассмотрим приложение, в котором производитель Kafka отправляет группу записей как транзакцию A.
После того, как записи были успешно отправлено в topi c, производитель Kafka выполнит commitTransaction
. Кластер Kafka получает запрос на транзакцию фиксации и успешно фиксирует записи, которые являются частью транзакции A. Кластер Kafka отправляет подтверждение относительно успешной фиксации.
Однако из-за некоторой проблемы это подтверждение теряется, вызывая исключение Timeout
по телефону commitTransaction
производителя Kafka. Таким образом, хотя записи были зафиксированы в кластере Kafka, с точки зрения производителя, фиксация не удалась.
Обычно в таком сценарии приложение повторяет отправку записей транзакции A в новой транзакции B, но это приведет к дублированию записей, поскольку они уже были зафиксированы как часть транзакции A.
Возможен ли описанный выше сценарий? Как вы справляетесь с потерей подтверждения commitTransaction
и возможным дублированием записей, вызванным этим?