Как реализовать идемпотентность

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

Ответ

Идемпотентность означает, что повторные вызовы операции с одними и теми же параметрами не изменяют результат. В Go можно реализовать несколькими способами:

  1. Проверка состояния перед выполнением
    if !isProcessed(requestID) {
        process(request)
        markAsProcessed(requestID)
    }
  1. Использование мьютексов или каналов для блокировки дублирующих операций.

  2. Генерация уникального ID запроса (например, UUID) и его проверка:

    var processedRequests = make(map[string]bool)
    func HandleRequest(id string, data Data) error {
        if processedRequests[id] {
            return nil // или ошибку, если нужно
        }
        processedRequests[id] = true
        // основная логика
    }

Для распределенных систем используйте Redis с SETNX или базу данных с уникальными индексами.