Какое влияние оказывают режимы подтверждения при асинхронной отправке в kafka? - PullRequest
0 голосов
/ 22 мая 2019

Оказывают ли влияние режимы подтверждения («0», «1», «все»), когда мы отправляем сообщения с использованием асинхронного send() вызова?

Я пытался измерить задержку отправки вызова (чтопутем записи времени до и после вызова метода send()) и наблюдения, что и (асинхронная отправка acks=1), и (асинхронная отправка acks=all) заняли одно и то же время.

Однакоявная разница в пропускной способности.

producer.send(record, new ProducerCallback(record));

Я думал, что отправка вызова будет заблокирована, когда мы используем acks=all даже в асинхронном режиме.Может кто-нибудь объяснить, как режимы подтверждения («0», «1», «все») работают в асинхронном режиме?

1 Ответ

1 голос
/ 22 мая 2019

Согласно документам :

public Future send (запись ProducerRecord, Обратный звонок)

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

Итак, одно можно сказать наверняка, что асинхронный "send" не особо заботится о том, что такое конфигурация "acks". Все, что он делает, это помещает сообщение в буфер. Как только этот буфер начинает обрабатываться (управляется свойствами linger.ms и batch.size), тогда проверяется «acks».

Если acks = 0 -> Просто выстрелить и забыть. Продюсер не будет ждать подтверждения.

Если acks = 1-> Подтверждение отправляется брокером, когда сообщение успешно записывается в лидере.

Если acks = all -> Посредник отправляет подтверждение, когда сообщение успешно записано на все реплики.

В случае 1 и всех это становится блокирующим вызовом, поскольку производитель будет ожидать подтверждения, но вы можете не заметить этого, поскольку это происходит в параллельном потоке. В случае acks = all, ожидается, что получение ack займет немного больше времени, чем acks = 1 (очевидными причинами являются сетевая задержка и количество реплик).

Кроме того, вы должны сконфигурировать свойство «retries» в вашем асинхронном производителе, чтобы в случае сбоя подтверждения (по какой-либо причине, например, пакет был поврежден / потерян), производитель знал, сколько раз ему следует повторить попытку отправки сообщения. (увеличить гарантию доставки).

И наконец: «Тем не менее, существует четкая разница в пропускной способности». - Это правда из-за задержки подтверждения от брокера к потоку производителя.

Надеюсь, это поможет! :)

...