Расскажи про использование событий (event-driven подход) на твоём примере
Answer from AI
sobes.tech AI
В одном из проектов на Go я реализовывал event-driven архитектуру для обработки заказов в системе электронной коммерции. Основная идея заключалась в том, что при наступлении определённых событий (например, создание заказа, оплата, отгрузка) генерировались события, которые подписчики обрабатывали асинхронно.
Для этого я использовал каналы (channels) и горутины, чтобы отделить генерацию событий от их обработки. Например, при создании заказа событие отправлялось в канал, а отдельный воркер слушал этот канал и выполнял задачи, такие как уведомление пользователя, обновление статистики и т.д.
Пример кода:
package main
import (
"fmt"
"time"
)
type OrderEvent struct {
OrderID string
Type string
}
func eventProducer(events chan<- OrderEvent) {
events <- OrderEvent{OrderID: "12345", Type: "OrderCreated"}
}
func eventConsumer(events <-chan OrderEvent) {
for event := range events {
switch event.Type {
case "OrderCreated":
fmt.Printf("Обработка события создания заказа: %s\n", event.OrderID)
// Дополнительная логика
}
}
}
func main() {
events := make(chan OrderEvent)
go eventConsumer(events)
eventProducer(events)
time.Sleep(time.Second) // Ждём обработки
}
Такой подход позволяет легко масштабировать обработку событий и добавлять новые подписчики без изменения генератора событий.