> Как обеспечить идемпотентность запросов на создание виртуальных машин (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Альфа-банк
Стек: Go
> Пример ответа
Идемпотентность запросов на создание виртуальных машин обеспечивается с помощью уникального ключа идемпотентности (idempotency key), который клиент передает в каждом запросе. Сервер проверяет, был ли уже обработан запрос с таким ключом, и если да - возвращает предыдущий результат, не создавая новую VM.
В Go это реализуется, например, через middleware и хранилище ключей (Redis, PostgreSQL или in-memory map с TTL). Пример:
GOtype 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.
> Похожие задачи по Go
Как определяется, куда положить переменную в памяти, и кто это определяет
Что делать первым шагом внутри сервиса создания виртуальной машины
Насколько знаком с Kubernetes на уровне пользователя
Что такое consumer group в брокерах сообщений
> Похожие задачи по backend
Как определяется, куда положить переменную в памяти, и кто это определяет
Что делать первым шагом внутри сервиса создания виртуальной машины
Насколько знаком с Kubernetes на уровне пользователя
Что такое consumer group в брокерах сообщений
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью