Ответ
Событийно-ориентированная архитектура (Event-Driven Architecture, EDA) — это архитектурный шаблон, в котором компоненты системы взаимодействуют путем производства и потребления асинхронных событий. Вместо прямых вызовов (запрос-ответ) компоненты генерируют события, сигнализирующие о факте, а другие, заинтересованные компоненты, реагируют на них независимо.
Ключевые компоненты:
- Источник события (Event Producer/Publisher): Генерирует событие (например, "Заказ создан").
- Канал событий (Event Channel/Bus): Посредник (часто Message Broker), который доставляет события.
- Обработчик события (Event Consumer/Subscriber): Компонент, который "слушает" канал и реагирует на события.
Пример на Spring Boot с Kafka:
// 1. Producer (Контроллер или сервис)
import org.springframework.kafka.core.KafkaTemplate;
@Service
public class OrderService {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void createOrder(Order order) {
// ... бизнес-логика создания заказа ...
// Публикация события в топик Kafka
kafkaTemplate.send("order-created", "Order #" + order.getId() + " created.");
// Метод НЕ ждет ответа от подписчиков
}
}
// 2. Consumer (Сервис уведомлений)
import org.springframework.kafka.annotation.KafkaListener;
@Service
public class NotificationService {
@KafkaListener(topics = "order-created", groupId = "notification-group")
public void handleOrderCreatedEvent(String eventMessage) {
System.out.println("[Notification] Received event: " + eventMessage);
// Отправляем email или push-уведомление клиенту
sendEmailToCustomer(eventMessage);
}
private void sendEmailToCustomer(String message) { /* ... */ }
}
// 3. Другой Consumer (Сервис аналитики)
@Service
public class AnalyticsService {
@KafkaListener(topics = "order-created", groupId = "analytics-group")
public void updateAnalytics(String eventMessage) {
System.out.println("[Analytics] Logging order event: " + eventMessage);
// Обновляем метрики и дашборды
}
}
Преимущества EDA:
- Слабая связность: Продюсеры и консьюмеры ничего не знают друг о друге.
- Асинхронность и отзывчивость: Продюсер не блокируется.
- Масштабируемость: Консьюмеры можно масштабировать независимо.
- Гибкость: Новые обработчики добавляются легко, подписываясь на существующие события.
Недостатки и сложности:
- Сложность отладки и трассировки потока выполнения.
- Гарантии доставки: Требует настройки брокера (at-least-once, exactly-once).
- Управление порядком событий (ordering) может быть нетривиальным.
- Возрастает общая сложность системы.