Подходит ли Apache Kafka для синхронного взаимодействия по схеме «запрос-ответ»?

«Подходит ли Apache Kafka для синхронного взаимодействия по схеме «запрос-ответ»?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, Kafka изначально не предназначена для синхронных запросов-ответов. Это асинхронная система потоковой передачи событий, где производители и потребители полностью развязаны.

Почему это плохая идея:

  • Сложность: Требуется вручную реализовывать корреляцию запросов и ответов, управление таймаутами и временными топиками.
  • Производительность: Синхронное ожидание блокирует поток и сводит на нет преимущества высокой пропускной способности Kafka.
  • Надёжность: Обработка ошибок и гарантии доставки становятся значительно сложнее.

Альтернативы:

  1. Для синхронных вызовов: Используйте HTTP (REST, gRPC) или RPC-фреймворки.
  2. Для асинхронных сценариев с ответом: Можно эмулировать паттерн "запрос-ответ", но это нетривиально:
    • Клиент публикует запрос в топик requests с уникальным correlationId.
    • Сервис-обработчик потребляет запрос, обрабатывает его и публикует ответ в топик responses, используя тот же correlationId.
    • Клиент подписывается на топик responses и фильтрует сообщения по своему correlationId.

Пример (упрощённая эмуляция на Java):

// Клиент отправляет запрос
String corrId = UUID.randomUUID().toString();
ProducerRecord<String, String> request = new ProducerRecord<>("user.requests", corrId, "{"userId":123}");
producer.send(request);

// Клиент подписывается на ответы и ждёт своё сообщение
consumer.subscribe(List.of("user.responses"));
ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(5));
for (ConsumerRecord<String, String> record : records) {
    if (record.key().equals(corrId)) {
        System.out.println("Получен ответ: " + record.value());
        break;
    }
}

Вывод: Используйте Kafka для асинхронного потока событий, а для синхронных коммуникаций выбирайте подходящие инструменты.