Ответ
Хореография в Saga — это подход к управлению распределёнными транзакциями, где каждый сервис самостоятельно реагирует на события от других сервисов, без централизованного оркестратора. Каждый шаг транзакции выполняется локально, а сервисы обмениваются событиями через брокер (Kafka, RabbitMQ и т. д.).
Пример:
// Сервис A: создаёт заказ и публикует событие
func CreateOrder() {
// Локальная транзакция
tx := db.Begin()
defer tx.Rollback()
order := Order{Status: "pending"}
tx.Create(&order)
// Отправка события
event := OrderCreatedEvent{OrderID: order.ID}
PublishToKafka("order.created", event)
tx.Commit()
}
// Сервис B: слушает событие и резервирует товар
func OnOrderCreated(event OrderCreatedEvent) {
tx := db.Begin()
defer tx.Rollback()
// Локальная транзакция
ReserveStock(event.OrderID)
PublishToKafka("stock.reserved", event)
tx.Commit()
}
Плюсы:
- Высокая масштабируемость (нет единой точки отказа).
- Гибкость (сервисы слабо связаны).
Минусы:
- Сложнее отслеживать поток транзакций.
- Труднее обрабатывать ошибки (нужны компенсирующие транзакции).