Идемпотентность
Идемпотентный промежуточный слой 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, чтобы избежать выделения данных здесь
}