Idempotency

A plataforma DevPrime oferece uma abordagem automática de idempotência permitindo controlar comandos duplicados tanto em requests HTTP/gRPC quanto serviços de Stream (Kafka, RabbitMQ).

A estratégia de idempotência é bastante aplicada para evitar por exemplo a cobrança de um pagamento em duplicidade recebido na API. Para melhor visualizar nós estamos falando sobre o request com um comando POST/PUT/PATCH ou um evento que chegue duplicado pelo Stream.

Alguns serviços de Stream enviam eventualmente mensagens em duplicidade para garantir a alta velocidade de entrega e isso obriga nas aplicações o controle de idempotência.

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

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

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

Efetuando o primeiro post na API de Order
Ao observar o log visualize a informação da idempotência como ativa nesse request iniciando a proteção contra duplicidade.

DevPrime Capabilities idempotency

Efetuando um segundo post na API de Order idêntico ao anterior
Nesse momento nós estamos repetindo o cenário só que agora já teremos outra resposta no controle de idempotência.

Ao analisar o resultado da API nós visualizamos a recusa do request duplicado
DevPrime Capabilities idempotency

Ao analisar o Log no trecho da idempotência encontrará o “Reject”
DevPrime Capabilities idempotency

Configuração da idempotência em dois passos
A configuração é um processo simples e customizável

Habilite a Idempotency na chave “DevPrime_App” definindo o valor “Enable” 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 “State” para informações de controle das 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 a idempotência manualmnte
Nos cenários que desejar é possível configurar manualmente o suporte a idempotência.

1
2
3
4
5
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 recurso poderoso presente no DevPrime Stack. Utilize a plataforma Devprime para acelerar a jornada de modernização de aplicações e desenvolvimento de plataformas digitais.

Mais detalhes sobre cenários deidempotência
Implementing idempotency in microservices
Idempotency in microservices and REST APIs
Implementing idempotency in microservices

Última modificação March 16, 2022 (9c7f636)