В случае ручного смещения фиксации в Kafka, что происходит в случае сбоя? Пример -> Предположим, что зафиксировано смещение 0, зафиксировано смещение 1 — нет, а затем зафиксировано смещение 2. Сообщение по смещению 1 повторяется?
Это зависит от того, как вы совершаете:
В commitSync
предполагая, что вы фиксируете каждое смещение отдельно, как в вашем примере, если смещение 1 не зафиксировано, оно будет повторять попытку фиксации этого смещения до тех пор, пока не добьется успеха или пока не столкнется с ошибкой nonRetryable.
Одним из недостатков этого механизма является то, что приложение блокируется до тех пор, пока брокер не ответит, что ограничивает пропускную способность приложения.
На commitAsync
, с другой стороны, нет повторной попытки, если ему не удалось зафиксировать смещение 1. Причина этого в том, что к тому времени, когда брокер ответит, вернитесь к вашему клиенту Kafka, может быть более поздняя фиксация, которая уже была успешной.
Представьте на вашем примере, что фиксация сообщения со смещением 1 не удалась из-за временной проблемы с сетью. Тем временем приложение уже успешно обработало сообщение со смещением 2. Если мы сейчас повторим предыдущую неудачную фиксацию, возможно, удастся зафиксировать смещение 1 после 2 уже зафиксировано. В случае перебалансировки это приведет к большему дублированию.
Я не уверен, что понимаю ваш вопрос, поскольку повторной попытки для асинхронного режима нет (как я уже упоминал в своем ответе). Обратите внимание, что вызовы идут в порядке вызовов. Но в моем примере у Kafka были проблемы с сетью, поэтому смещение фиксации 1 так и не поступило к брокеру, в то время как смещение 2 было успешно зафиксировано.
Из Javadoc — Смещения, совершенные с помощью нескольких вызовов [commitAsync], гарантированно отправляются в том же порядке, что и вызовы.... Таким образом, это означает, что если есть повторная попытка, разве она не должна быть заказана (по крайней мере, в пределах одного и того же экземпляра потребителя)?