Ответ
Для предотвращения дублирования запросов можно использовать идемпотентные ключи (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)
- Проверка ключей на уровне базы данных