Idempotência

O middleware de idempotência do Fiber permite a criação de APIs tolerantes a falhas, onde solicitações repetidas (por exemplo, devido a problemas na rede do cliente) não causam erroneamente a execução da mesma operação várias vezes no servidor, servindo como um mecanismo de idempotência de API geral.

Assinatura da Função

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

Código de Exemplo

Importe o pacote de middleware do framework web Fiber.

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

Configuração Padrão

Após inicializar a aplicação Fiber, o middleware pode ser referenciado diretamente.

app.Use(idempotency.New())

Configuração Personalizada

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

Opções de Configuração

Propriedade Tipo Descrição Valor Padrão
Next func(*fiber.Ctx) bool Next define uma função para ignorar o middleware quando retorna verdadeiro. Uma função para uso seguro de métodos
Lifetime time.Duration Lifetime é o tempo máximo de vida da chave de idempotência. 30 * time.Minute
KeyHeader string KeyHeader é o nome do cabeçalho contendo a chave de idempotência. "X-Idempotency-Key"
KeyHeaderValidate func(string) error KeyHeaderValidate define uma função para validar a sintaxe do cabeçalho de idempotência. Uma função para validação de UUID
KeepResponseHeaders []string KeepResponseHeaders é a lista de cabeçalhos a serem preservados da resposta original. nil (preserva todos os cabeçalhos)
Lock Locker Lock trava a chave de idempotência. Uma trava na memória
Storage fiber.Storage Storage armazena os dados de resposta de acordo com a chave de idempotência. Armazenamento na memória

Configuração Padrão

var ConfigDefault = Config{
    Next: func(c *fiber.Ctx) bool {
        // Ignora o middleware se a solicitação for feita usando métodos HTTP seguros
        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 { // O comprimento do UUID é de 36 caracteres
            return fmt.Errorf("%w: comprimento inválido: %d != %d", ErrInvalidIdempotencyKey, l, wl)
        }
        return nil
    },
    KeepResponseHeaders: nil,
    Lock: nil, // Definido em configDefault para evitar alocação de dados aqui
    Storage: nil, // Definido em configDefault para evitar alocação de dados aqui
}