Передача данных в Kafka синхронная или асинхронная?
Что проверяют
Понимаете ли вы, что в Kafka асинхронность и надёжность это две независимые настройки, а не одна шкала. Заодно проверяют, работали ли вы с продюсером руками: ответ «асинхронно, потому что очередь» слишком общий и ничего не говорит.
Как отвечать
Отправка всегда асинхронная. producer.send(record) кладёт запись в буфер и сразу возвращает Future<RecordMetadata>, а реальной отправкой занимается фоновый поток, который собирает батчи по batch.size и ждёт linger.ms. Синхронность это ваш выбор заблокироваться:
producer.send(rec, (meta, ex) -> { if (ex != null) log.error("не ушло", ex); });
producer.send(rec).get(); // синхронно, round-trip на каждое сообщениеВторая, независимая ось это acks: 0 не ждать ничего, 1 ждать лидера, all ждать реплики из min.insync.replicas. Она отвечает за то, чего ждёт брокер, а не за то, блокируется ли ваш поток. Поэтому нормальный боевой режим это acks=all плюс идемпотентный продюсер плюс разбор результата в колбэке: надёжно и без блокировок. Про потребителя добавьте, что он всегда тянет сам, через poll.
Где спотыкаются
Думают, что без .get() об ошибке никто не узнает. Ошибка приходит в колбэк или во Future, и если их не читать, записи теряются молча. Перед остановкой приложения нужен flush или close, иначе буфер уедет в никуда.
Второе: ставят .get() в цикле ради надёжности. Батч не собирается, каждое сообщение стоит полного круга по сети, пропускная способность падает в разы. Надёжность даёт acks и реплики, а не блокировка вызывающего потока.
Третье: обещают глобальный порядок сообщений. Порядок существует только внутри партиции, то есть определяется ключом. К тому же несколько незавершённых запросов в соединении вместе с повторами могут переставить записи местами, если не включена идемпотентность.