Idempotência

A plataforma Devprime oferece uma abordagem de idempotência automática que permite controlar comandos duplicados em solicitações HTTP/gRPC e serviços Stream (Kafka, RabbitMQ).

A estratégia de idempotência é amplamente aplicada para evitar, por exemplo, a cobrança de uma segunda via de pagamento recebida na API. Para melhor visualizar, estamos falando da solicitação com um comando POST/PUT/PATCH ou de um evento que chega duplicado pelo Stream.

Alguns serviços do Stream eventualmente enviam mensagens em duplicado para garantir alta velocidade de entrega e isso força os aplicativos a controlar a idempotência.

O Devprime oferece uma abordagem muito flexível para a configuração do serviço que pode ser configurada para iniciar automaticamente, por parâmetro enviado pelo consumidor e/ou restrito a processos específicos de acordo com a estratégia de cada microsserviço.

O recurso de idempotência pode ser configurado para funcionar automaticamente usando o parâmetro “action” como “auto” e o parâmetro “flow” como “backend” habilitando o recurso sem a necessidade de passar uma chave estrangeira ao consumir a API.

Para visualizar melhor na prática o cenário é essencial acompanhar a sequência de imagens onde demonstramos no Log todo o processo. O Log Automático é gerado pela abordagem nativa de Servabilidade.

Fazendo o primeiro post na API de pedidos
Ao examinar o log, visualize as informações de idempotência como ativas nessa solicitação, iniciando a proteção contra duplicidade.

Capacidades Devprime idempotência

Fazer um segundo post na API de pedidos idêntico ao anterior
Neste momento estamos repetindo o cenário só que agora teremos outra resposta no controle da idempotência.

Ao analisar o resultado da API vemos a recusa da solicitação duplicada
![Idempotência de recursos do Devprime]@@@@5@@@@@

Quando você olhar para o Log na seção idempotência você vai encontrar o “Rejeitar”
![Capacidades Devprime idempotência]@@@@6@@@

Configuração em duas etapas da idempotência
A configuração é um processo simples e personalizável

Habilite Idempotência na chave “Devprime_App” definindo o valor “Habilitar” como “true”.

1
2
3
4
5
6
7
8
9
    "Idempotency": {
      "Enable": "true",
      "Alias": "State2",
      "Duration": "86400",
      "Flow": "backend",
      "key": "idempotency-key",
      "Scope": "all",
      "Action": "auto"
    }

Adicione uma segunda persistência Redis na chave “Estado” para informações de controle de transações automáticas de idempotência.

1
2
3
4
5
6
7
8
9
{
  "enable": "true",
  "alias": "State2",
  "dbtype": "redis",
  "connection": "127.0.0.1:6379,password=LltF8Nx*yo",
  "timeout": "5",
  "retry": "2",
  "durationofbreak": "45"
}

Ativando idempotência manualmnte
Nos cenários desejados, você pode configurar manualmente o suporte à idempotência.

1
2
3
4
5
6
7
8
app.MapPost("/v1/order", async (HttpContext http,
IOrderService Service, 
Devprime.Web.ViewModels.Order.Order command) =>
await Dp(http).Pipeline(() =>
        {
            Dp(http).Idempotency.Enable = true;
            Service.Add(command.ToApplication());
        }));

Você acabou de conferir um poderoso recurso presente no Devprime Stack. Use a plataforma Devprime para acelerar a jornada de modernização de aplicativos e desenvolvimento de plataformas digitais.

Mais detalhes sobre cenários de deidempotência
Implementando idempotência em microsserviços
Idempotência em microsserviços e APIs REST
Implementando idempotência em microsserviços

Última modificação October 26, 2023 (795e8af6)