> Как обнаруживать и реагировать на проблемы с отменой брони (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: sferaplatform.ru

Стек: Go

> Пример ответа

Для обнаружения проблем с отменой брони в Go-сервисе можно использовать комбинацию мониторинга, логирования и обработки ошибок. Основные подходы:

  1. Мониторинг метрик: Используйте Prometheus для отслеживания количества неудачных отмен, времени выполнения и кодов ошибок. Например:
GO
var cancelFailures = prometheus.NewCounterVec(
prometheus.CounterOpts{Name: "booking_cancel_failures_total"},
[]string{"reason"},
)
  1. Структурированное логирование: Логируйте каждый вызов отмены с контекстом (ID брони, пользователь, причина ошибки). Используйте slog или logrus:
GO
slog.Error("cancel failed", "booking_id", id, "error", err, "user", userID)
  1. Retry с экспоненциальной задержкой: Для временных сбоев (сетевые ошибки, таймауты) реализуйте повторные попытки:
GO
err := retry.Do(
func() error { return cancelBooking(ctx, id) },
retry.Attempts(3),
retry.Delay(time.Second),
retry.MaxDelay(5*time.Second),
)
  1. Dead Letter Queue (DLQ): Если отмена не удалась после всех попыток, отправляйте событие в очередь для ручной обработки или фонового восстановления:
GO
dlq.Publish("cancel_failed", event{BookingID: id, Error: err.Error()})
  1. Health check эндпоинты: Проверяйте доступность внешних систем (платежный шлюз, база данных) перед выполнением отмены.

Реагирование включает:

  • Уведомление команды через алерты (например, PagerDuty) при превышении порога ошибок.
  • Автоматический откат состояния (если отмена частично выполнена).
  • Возврат пользователю понятного сообщения об ошибке с кодом для поддержки.

Пример обработчика:

GO
func (h *Handler) CancelBooking(w http.ResponseWriter, r *http.Request) {
id := r.URL.Query().Get("id")
err := h.service.Cancel(r.Context(), id)
if err != nil {
if errors.Is(err, ErrNotFound) {
http.Error(w, "Бронь не найдена", http.StatusNotFound)
} else {
slog.Error("cancel error", "id", id, "err", err)
http.Error(w, "Не удалось отменить бронь", http.StatusInternalServerError)
}
return
}
w.WriteHeader(http.StatusOK)
}

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью