Как решается проблема дубликата входящих запросов

«Как решается проблема дубликата входящих запросов» — вопрос из категории Архитектура, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для предотвращения дублирования запросов можно использовать идемпотентные ключи (idempotency keys). Клиент генерирует уникальный ключ для каждого запроса, сервер сохраняет его и результат обработки. При повторном запросе с тем же ключом возвращается сохранённый результат.

Пример реализации:

var cache = sync.Map{}

func handleRequest(w http.ResponseWriter, r *http.Request) {
    key := r.Header.Get("Idempotency-Key")
    if key == "" {
        http.Error(w, "Idempotency-Key header required", http.StatusBadRequest)
        return
    }

    if val, ok := cache.Load(key); ok {
        w.Write(val.([]byte))
        return
    }

    // Обработка запроса
    response := []byte("response data")
    cache.Store(key, response)
    w.Write(response)
}

Дополнительные подходы:

  • Использование Redis/Memcached для хранения ключей
  • Ограничение времени жизни ключей (TTL)
  • Проверка ключей на уровне базы данных