Ответ
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 — для асинхронных потоков событий.