Ответ
Event-Driven Architecture (EDA) — это архитектурный паттерн построения систем, в котором взаимодействие между компонентами (сервисами) происходит посредством асинхронного обмена событиями (events).
Событие — это уведомление о значимом изменении состояния в системе (например, UserRegistered
, OrderPlaced
, PaymentCompleted
).
Ключевые компоненты:
- Event Producer (Источник событий): Компонент, который генерирует события.
- Event Consumer (Потребитель событий): Компонент, который подписывается на события и реагирует на них.
- Event Channel / Broker (Шина событий): Посредник, который принимает события от источников и доставляет их потребителям (например, RabbitMQ, Kafka, NATS).
Пример на Go (упрощенная имитация с каналами):
В реальной системе вместо каналов использовался бы брокер сообщений.
package main
import (
"fmt"
"time"
)
// Event Producer
func publishEvents(events chan<- string) {
for i := 0; i < 3; i++ {
event := fmt.Sprintf("OrderPlaced: #%d", i)
fmt.Printf("Published: %sn", event)
events <- event
time.Sleep(1 * time.Second)
}
close(events)
}
// Event Consumer
func processNotifications(events <-chan string) {
for event := range events {
fmt.Printf(" -> Notification service received: %sn", event)
}
}
func main() {
events := make(chan string, 1) // Буферизированный канал
go publishEvents(events)
processNotifications(events)
}
Преимущества:
- Слабая связность (Loose Coupling): Сервисы не знают друг о друге, они знают только о событиях. Это упрощает их замену и обновление.
- Масштабируемость: Можно независимо масштабировать источники и потребители событий.
- Отказоустойчивость (Resilience): Если один из потребителей временно недоступен, события могут быть обработаны позже, когда он вернется в строй.
- Асинхронность: Система остается отзывчивой, так как долгие операции выполняются в фоне.
Недостатки:
- Сложность отладки: Трудно отследить полный путь обработки запроса, который проходит через несколько асинхронных сервисов.
- Конечная согласованность (Eventual Consistency): Нет гарантии, что все части системы будут согласованы в один и тот же момент времени.
- Управление порядком событий: Гарантировать строгий порядок обработки может быть сложно и требовать дополнительных усилий.