Каким образом гарантируется упорядочивание во время сбоев в Kafka Async Producer?

Если я использую производителя Kafka Async, предположим, что в буфере находится X сообщений. Когда они фактически обрабатываются на клиенте, и если брокер или определенный раздел не работает на какое-то время, клиент kafka будет повторять попытку, и если сообщение не удалось, пометит ли он конкретное сообщение как сбойное и перейдет к следующему сообщению (это может приводят к сообщениям о неисправности)? Или он откажется от оставшихся сообщений в пакете, чтобы сохранить порядок?

Затем я должен поддерживать порядок, поэтому в идеале я хотел бы, чтобы кафка провалил пакет с того места, где он не удался, чтобы я мог повторить попытку из точки сбоя, как мне этого добиться?


person Guruprasad GV    schedule 08.02.2016    source источник
comment
Kafka будет повторять попытку только в том случае, если вы изменили настройку удаления по умолчанию. fron kafka docs: разрешение повторных попыток потенциально изменит порядок записей, потому что если две записи отправляются в один раздел, и первая не выполняется и повторяется, но вторая выполняется успешно, тогда вторая запись может появиться первой.   -  person Hector    schedule 03.09.2016


Ответы (2)


Как говорится в документации kafka о повторных попытках

Установка значения больше нуля приведет к тому, что клиент повторно отправит любую запись, отправка которой не удалась с потенциально временной ошибкой. Обратите внимание, что эта повторная попытка ничем не отличается от повторной отправки записи клиентом после получения ошибки. Разрешение повторных попыток потенциально изменит порядок записей, потому что, если две записи отправляются в один раздел, и первая не выполняется и повторяется, но вторая выполняется успешно, тогда вторая запись может появиться первой.

Итак, отвечая на ваш вопрос о заголовке, никакой кафка не имеет гарантий порядка при асинхронных отправках.


Я обновляю базу ответов на вопрос Питера Дэвиса.

Я думаю, что если вы хотите отправить в пакетном режиме, единственный способ защитить его, я бы установил max.in.flight.requests.per.connection=1, но, как говорится в документации:

Обратите внимание, что если для этого параметра установлено значение больше 1 и есть неудачные отправки, существует риск переупорядочения сообщений из-за повторных попыток (т. Е. Если повторные попытки разрешены).

person Nautilus    schedule 08.02.2016
comment
Это не отвечает поведению, если retries = 0. Если вам требуется упорядочивание, но вы хотите отправить пакет без вызова Future.get () после каждой отправки, могу ли я установить retries = 0 и ожидать, что, если производитель не сможет отправить одно сообщение, он не сможет отправить все последующие сообщения в раздел для сохранения порядка? - person Peter Davis; 29.02.2016
comment
Вы можете положиться на упорядочение Kafka, если вы установили ноль повторных попыток и каждая из ваших тем имеет только один раздел. Вам не нужно устанавливать max.in.flight.requests.per.connection = 1, поскольку у вас есть только один раздел, поэтому у Kafka будет только 1 в запросе полета, поскольку разделы являются механизмом kafka для параллизма - person Hector; 03.09.2016

Начиная с Kafka 0.11.0, существует параметр enable.idempotence, как задокументировано.

enable.idempotence: если установлено true, производитель гарантирует, что в поток записывается ровно одна копия каждого сообщения. Если false, производитель повторяет попытку из-за сбоев брокера и т. Д., Может записать дубликаты повторного сообщения в поток. Обратите внимание, что для включения идемпотентности требуется, чтобы max.in.flight.requests.per.connection было меньше или равно 5, количество повторных попыток должно быть больше 0, а acks должно быть all. Если эти значения явно не установлены пользователем, будут выбраны подходящие значения. Если установлены несовместимые значения, будет выдано ConfigException.

Type: boolean Default: false

Это гарантирует, что сообщения упорядочены и что во время сеанса производителя не произойдет никаких потерь. К сожалению, производитель не может установить идентификатор последовательности, поэтому Kafka может предоставить эти гарантии только для каждого сеанса производителя.

Взгляните на Apache Pulsar, если вам нужно установить идентификатор последовательности, что позволит вам использовать внешний идентификатор последовательности, что гарантирует упорядоченный и точный однократный обмен сообщениями при отработке отказа как брокера, так и производителя.

person Evgeniy Berezovsky    schedule 07.03.2020