Какой у вас опыт работы с событийно-ориентированной архитектурой (EDA)?

«Какой у вас опыт работы с событийно-ориентированной архитектурой (EDA)?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, есть опыт реализации EDA в Spring-приложениях и микросервисах.

Реализация и инструменты:

  • В рамках одного приложения: Использовал Spring Events для слабой связности компонентов.
  • Межсервисное взаимодействие: Применял брокеры сообщений Apache Kafka и RabbitMQ для асинхронной и надежной передачи событий между микросервисами.

Пример использования Spring Events:

// 1. Определение события
public class OrderCreatedEvent {
    private final Order order;
    public OrderCreatedEvent(Order order) { this.order = order; }
    public Order getOrder() { return order; }
}

// 2. Публикация события
@Service
public class OrderService {
    private final ApplicationEventPublisher publisher;
    public void createOrder(Order order) {
        // ... логика сохранения заказа ...
        publisher.publishEvent(new OrderCreatedEvent(order));
    }
}

// 3. Обработка (подписка) на событие
@Component
public class NotificationService {
    @EventListener
    @Async // Для асинхронной обработки
    public void handleOrderCreated(OrderCreatedEvent event) {
        // Логика отправки уведомления о новом заказе
        System.out.println("Notification sent for order: " + event.getOrder().getId());
    }
}

Преимущества EDA:

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