Ошибка подтверждения транзакции Kafka commitTransaction - PullRequest
2 голосов
/ 29 апреля 2020

Согласно документации 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 и возможным дублированием записей, вызванным этим?

...