Ответ
Нет, Kafka изначально не предназначена для синхронных запросов-ответов. Это асинхронная система потоковой передачи событий, где производители и потребители полностью развязаны.
Почему это плохая идея:
- Сложность: Требуется вручную реализовывать корреляцию запросов и ответов, управление таймаутами и временными топиками.
- Производительность: Синхронное ожидание блокирует поток и сводит на нет преимущества высокой пропускной способности Kafka.
- Надёжность: Обработка ошибок и гарантии доставки становятся значительно сложнее.
Альтернативы:
- Для синхронных вызовов: Используйте HTTP (REST, gRPC) или RPC-фреймворки.
- Для асинхронных сценариев с ответом: Можно эмулировать паттерн "запрос-ответ", но это нетривиально:
- Клиент публикует запрос в топик
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 для асинхронного потока событий, а для синхронных коммуникаций выбирайте подходящие инструменты.