В каких сценариях следует выбрать REST API, а в каких — Apache Kafka?

«В каких сценариях следует выбрать REST API, а в каких — Apache Kafka?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

REST API и Apache Kafka — это принципиально разные технологии для разных архитектурных паттернов.

Критерий REST API (HTTP) Apache Kafka
Основная модель Синхронная, запрос-ответ (Request/Response). Асинхронная, поток событий/сообщений (Event Streaming).
Связь Прямая, точка-точка (клиент знает сервер). Развязанная, через брокер (производители и потребители не знают друг о друге).
Цель Выполнить операцию и получить немедленный результат. Надежно доставить, сохранить и обработать поток событий.

Когда использовать REST API:

  • Взаимодействие браузера с сервером (веб-приложения).
  • Мобильные или внешние API, где нужен четкий, немедленный ответ.
  • CRUD-операции с ресурсами (создать, прочитать, обновить, удалить).
  • Простые интеграции между 2-3 системами.

Пример REST-контроллера (Spring Boot):

@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return ResponseEntity.ok(user); // Синхронный ответ
    }
}

Когда использовать Apache Kafka:

  • Обработка данных в реальном времени (аналитика, мониторинг).
  • Микросервисная архитектура для асинхронной коммуникации через события (Event-Driven Architecture).
  • Сбор и агрегация логов с множества источников.
  • Сценарии, требующие буферизации, повторной обработки или где потребители могут отставать.

Пример производителя и потребителя Kafka (Spring Kafka):

// Сервис-производитель (отправляет событие)
@Service
public class OrderService {
    @Autowired
    private KafkaTemplate<String, OrderEvent> kafkaTemplate;

    public void placeOrder(Order order) {
        // ... бизнес-логика ...
        OrderEvent event = new OrderEvent(order, "CREATED");
        kafkaTemplate.send("order-events", order.getId(), event); // Асинхронная отправка
    }
}

// Сервис-потребитель (обрабатывает событие)
@Service
public class NotificationService {
    @KafkaListener(topics = "order-events")
    public void handleOrderEvent(OrderEvent event) {
        // Обрабатывает событие, когда дойдет очередь
        sendEmail(event.getOrder().getCustomerEmail(), "Your order was created.");
    }
}

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