← Назад к вопросам
Что такое событийно-управляемая архитектура и когда её применяют?
1.8 Middle🔥 121 комментариев
#REST API и микросервисы
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Событийно-управляемая архитектура (Event-Driven Architecture)
Это архитектурный паттерн, где компоненты взаимодействуют через события. Вместо прямых вызовов между компонентами они создают события при изменении своего состояния, а другие компоненты на эти события реагируют.
Основные компоненты
// Определение события
public class UserRegisteredEvent {
private String userId;
private String email;
private LocalDateTime createdAt;
// getters, setters
}
// Publisher - генерирует события
@Service
public class UserService {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void registerUser(UserDTO dto) {
User user = new User(dto);
userRepository.save(user);
// Публикуем событие
UserRegisteredEvent event = new UserRegisteredEvent(
user.getId(), user.getEmail(), LocalDateTime.now()
);
eventPublisher.publishEvent(event);
}
}
// Listener - реагирует на события
@Service
public class EmailNotificationService {
@EventListener
public void onUserRegistered(UserRegisteredEvent event) {
// Отправляем приветственное письмо
sendWelcomeEmail(event.getEmail());
}
}
Архитектурные паттерны
1. Broker Pattern — компоненты связаны через message broker
// RabbitMQ example
@Service
public class OrderService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void createOrder(Order order) {
orderRepository.save(order);
// Отправляем событие в очередь
rabbitTemplate.convertAndSend("order.exchange",
"order.created", order);
}
}
@Service
public class InventoryService {
@RabbitListener(queues = "inventory.queue")
public void handleOrderCreated(Order order) {
// Резервируем товары
reserveInventory(order);
}
}
2. Mediator Pattern — центральный медиатор координирует события
// При необходимости более сложной логики
@Service
public class OrderMediator {
@EventListener
public void onOrderCreated(OrderCreatedEvent event) {
// Координируем действия нескольких сервисов
inventoryService.reserve(event.getOrderId());
paymentService.charge(event.getOrderId());
notificationService.sendConfirmation(event);
}
}
Когда применяют
Идеально подходит для:
- Микросервисная архитектура — слабая связанность между сервисами
- Real-time системы — потребность в быстром отклике на изменения
- Асинхронная обработка — когда не нужен немедленный результат
- Сложные бизнес-процессы — орхестрация множества действий
- Масштабируемые системы — горизонтальное расширение
Преимущества
- Слабая связанность — компоненты не зависят друг от друга напрямую
- Масштабируемость — легко добавлять новые обработчики
- Асинхронность — не блокирует основной поток
- Гибкость — один event может обрабатываться разными сервисами
Недостатки
- Сложность отладки — сложнее отследить логику между компонентами
- Гарантии доставки — нужно учитывать потенциальные потери событий
- Задержки — асинхронность может привести к откладываниям
- Распределённые транзакции — saga pattern для обеспечения консистентности
Практический пример с Kafka
@Service
public class PaymentEventService {
@Autowired
private KafkaTemplate<String, PaymentEvent> kafkaTemplate;
public void processPayment(Payment payment) {
// Сохраняем платёж
paymentRepository.save(payment);
// Публикуем событие в Kafka
PaymentEvent event = new PaymentEvent(
payment.getId(),
payment.getAmount(),
LocalDateTime.now()
);
kafkaTemplate.send("payment-events", event.getPaymentId(), event);
}
}
@Service
public class ReportingService {
@KafkaListener(topics = "payment-events")
public void generateReport(PaymentEvent event) {
// Генерируем отчёты на основе события
reportRepository.save(createReport(event));
}
}
Событийно-управляемая архитектура - это мощный подход для создания гибких, масштабируемых систем, особенно в контексте микросервисов и real-time приложений.