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
}