Согласно документам :
public Future send (запись ProducerRecord,
Обратный звонок)
Асинхронно отправляет запись в тему и вызывает предоставленную
обратный вызов, когда отправка была подтверждена. Отправка асинхронная
и этот метод вернется сразу после записи
хранится в буфере записей, ожидающих отправки . Это позволяет
отправка многих записей параллельно без блокировки, чтобы ждать
ответ после каждого.
Итак, одно можно сказать наверняка, что асинхронный "send" не особо заботится о том, что такое конфигурация "acks". Все, что он делает, это помещает сообщение в буфер. Как только этот буфер начинает обрабатываться (управляется свойствами linger.ms и batch.size), тогда проверяется «acks».
Если acks = 0 -> Просто выстрелить и забыть. Продюсер не будет ждать подтверждения.
Если acks = 1-> Подтверждение отправляется брокером, когда сообщение успешно записывается в лидере.
Если acks = all -> Посредник отправляет подтверждение, когда сообщение успешно записано на все реплики.
В случае 1 и всех это становится блокирующим вызовом, поскольку производитель будет ожидать подтверждения, но вы можете не заметить этого, поскольку это происходит в параллельном потоке. В случае acks = all, ожидается, что получение ack займет немного больше времени, чем acks = 1 (очевидными причинами являются сетевая задержка и количество реплик).
Кроме того, вы должны сконфигурировать свойство «retries» в вашем асинхронном производителе, чтобы в случае сбоя подтверждения (по какой-либо причине, например, пакет был поврежден / потерян), производитель знал, сколько раз ему следует повторить попытку отправки сообщения. (увеличить гарантию доставки).
И наконец: «Тем не менее, существует четкая разница в пропускной способности». - Это правда из-за задержки подтверждения от брокера к потоку производителя.
Надеюсь, это поможет! :)