Idempotency in microservices and REST APIs

Implementando a idempotência em REST APIs e micoserviço baseado no DevPrime

As aplicações baeadas na plataforma DevPrime já dispoem de um recurso automático de idempotência protegendo os serviços para não ocorrer inclusões duplicadas.

Neste cenário nós utilizaremos uma chave obritatória enviada pela aplicação que estiver utilizando a API. Para utilizar o recurso basta alterar as configurações no microserviço baseado no DevPrime.

Criando um microserviço para utilizar no exemplo

Nós utilizaremos um microsserviço baseado na plataforma DevPrime

Iniciando a configuração da idempotência

Configuração da idempotência na chave “DevPrime_App”
Altere na configuração do Idempotency na opção “Enabled” para “true” e o “Flow” para “frontend”. Nós alteramos a “key” para “my-idempotency-key”. Com essa configuração a API vai requerer no Headar a chave de idempotência.
code .\src\app\appsettings.json

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

Inclua um segunda persistência na chave “DevPrime_State”
Nesse exemplo utilizaremos um Redis local com uma senha padrão
code .\src\app\appsettings.json

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"
}

Iniciando idempotência automática no microsserviço

Agora chegou o momento de testar a configuração. Antes de iniciar o microsserviço certifique de ter ativado os containers e criado a fila no RabbitMQ.

Execute a aplicação e faça um post pela API Order
Nós precisamos passar nesse cenário a chave de idempotência pelo Head por isso você precisa consumiar a API utilizando o curl, podtman, insomnia e muitas outras.

Iniciando o microsserviço configurado para usar uma chave de idempotência
DevPrime Capabilities Idempotency Key`

Um código json de exemplo para uso na API. Modifique nos seus testes.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "customerName": "Bill",
  "customerTaxID": "string",
  "itens": [
    {
      "description": "short",
      "amount": 1,
      "sku": "XNY1AC",
      "price": 100
    }
  ],
  "total": 100
}

No primeiro teste nós não passaremos a chave da idempotência no POST conforme exemplo realizado no Postman.
DevPrime Capabilities Idempotency Key

Ao olhar o retorna da API nós teremos uma negativa do request pela ausência da chave que na configuração com o “Flow” do tipo “Backend” é obrigatória e deve ser passada pelo Header.
DevPrime Capabilities Idempotency Key

Agora vamos adicionar a nossa chave “my-idempotency-key” e um valor guid.
DevPrime Capabilities Idempotency Key

Após confirmar o post no passo anterior o Log já registra sucesso no processo de idempotência.
DevPrime Capabilities Idempotency Key

Ao tentar realizar um novo Post com a mesma chave anterior o comando duplicado já é negado automaticamente.
DevPrime Capabilities Idempotency Key

Nesse artigo você observou como é fácil implementar o recurso de idempotência nos microsserviços desenvolvimento com a plataforma DevPrime.

Você tem a disposição configurações adicionais como “Action” que configurado como “manual” exige que você ative em um metodo especifico e/ou a “Scope” que pode limitar a atuação em um Adapter como “Web” ou “Stream”

Mais artigos sobre idempotência

Implementing idempotency in microservices
Building an idempotent event-driven microservices

Última modificação March 13, 2022 (28e2a97)