> Как обеспечить идемпотентность запросов на создание виртуальных машин (Go)

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

Компании: Альфа-банк

Стек: Go

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

Идемпотентность запросов на создание виртуальных машин обеспечивается с помощью уникального ключа идемпотентности (idempotency key), который клиент передает в каждом запросе. Сервер проверяет, был ли уже обработан запрос с таким ключом, и если да - возвращает предыдущий результат, не создавая новую VM.

В Go это реализуется, например, через middleware и хранилище ключей (Redis, PostgreSQL или in-memory map с TTL). Пример:

GO
type IdempotencyMiddleware struct {
store sync.Map // в продакшене заменить на Redis
}
func (m *IdempotencyMiddleware) Handle(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
key := r.Header.Get("Idempotency-Key")
if key == "" {
http.Error(w, "missing idempotency key", http.StatusBadRequest)
return
}
// Проверяем, был ли уже обработан запрос
if result, ok := m.store.Load(key); ok {
w.Header().Set("X-Idempotent-Replay", "true")
w.Write(result.([]byte))
return
}
// Буферизируем ответ
rec := &responseRecorder{ResponseWriter: w, body: &bytes.Buffer{}}
next.ServeHTTP(rec, r)
// Сохраняем результат по ключу (с TTL, например, 24 часа)
m.store.Store(key, rec.body.Bytes())
// В реальности: store.Set(key, body, 24*time.Hour)
})
}

Ключевые моменты:

  • Клиент генерирует UUID и передает его в заголовке Idempotency-Key.
  • Сервер блокирует повторное создание VM, возвращая сохраненный ответ (статус, ID VM).
  • Для критических операций (создание VM) используйте транзакционную блокировку на уровне БД или Redis с атомарной проверкой SET NX EX.
  • Обрабатывайте ошибки: если запрос не завершился (таймаут), клиент может повторить с тем же ключом - сервер вернет результат первого выполнения.

Это гарантирует, что даже при повторных отправках (из-за сетевых сбоев) будет создана только одна VM.

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

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