Идемпотентность

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

Сигнатура функции

func New(config ...Config) fiber.Handler

Пример кода

Импортируем пакет промежуточного слоя Fiber веб-фреймворка.

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/idempotency"
)

Конфигурация по умолчанию

После инициализации приложения Fiber промежуточный слой можно использовать напрямую.

app.Use(idempotency.New())

Пользовательская конфигурация

app.Use(idempotency.New(idempotency.Config{
    Lifetime: 42 * time.Minute,
    // ...
}))

Опции конфигурации

Свойство Тип Описание Значение по умолчанию
Next func(*fiber.Ctx) bool Next определяет функцию для пропуска промежуточного слоя, если она возвращает true. Функция для безопасного использования метода
Lifetime time.Duration Lifetime - максимальный срок действия ключа идемпотентности. 30 * time.Minute
KeyHeader string KeyHeader - название заголовка, содержащего ключ идемпотентности. "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate определяет функцию для проверки синтаксиса заголовка идемпотентности. Функция для проверки UUID
KeepResponseHeaders []string KeepResponseHeaders - список заголовков для сохранения из исходного ответа. nil (сохраняет все заголовки)
Lock Locker Lock - блокирует ключ идемпотентности. Блокировка в памяти
Storage fiber.Storage Storage - сохраняет данные ответа в соответствии с ключом идемпотентности. Хранение в памяти

Конфигурация по умолчанию

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // Пропустить промежуточный слой, если запрос сделан с использованием безопасных методов HTTP
        return fiber.IsMethodSafe(c.Method())
    },
    Lifetime: 30 * time.Minute,
    KeyHeader: "X-Idempotency-Key",
    KeyHeaderValidate: func(k string) error {
        if l, wl := len(k), 36; l != wl { // Длина UUID составляет 36 символов
            return fmt.Errorf("%w: недопустимая длина: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // Установлено в configDefault, чтобы избежать выделения памяти здесь
    Storage: nil, // Установлено в configDefault, чтобы избежать выделения данных здесь
}