Implementing idempotency in microsserviços
Nós implementaremos um exemplo no modo backend onde não é necessário passar uma chave para consumir a API do microsserviço. O processo gerencia automaticamente a idempotência confrome o payload da API.
O primeiro passo para habilitar a idempotência é modificar a configuração “Idempotency” no Idempotency no “Devprime_App”. Deopis caso não tenha feito é necessário adicionar um segundo State para a persistência da idempotência.
Parâmetros utilizados na configuração
- Alias indica o State utilizado na persistência da Idempotency
- Duration é utilizado para definir o tempo do registro de controle de duplicidade do comando.
- Flow indica tipo de Idempotency e pode ser definido como “backend” ou “frontend”
- Key é utilizada para definir uma chave requerida no head no Flow “frontend”
- Scope limita a atuação da idepontencia e utiliza os parametros “all|web|stream”
- Action define se a idepontencia será automática ou manual com os parâmetros “auto|manual”
Criando um microserviço para utilizar no exemplo
Nós utilizaremos um microsserviço baseado na plataforma Devprime
- Utilize uma conta ativa no Devprime e ative o Devprime CLI.
- Inicie os containers pelo Docker (MongoDB, RabbitMQ e Redis)
- Crie a fila orderevents no RabbitMQ.
- Crie um novo microsserviço “order”.
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”
code src/app/appsettings.json
|
|
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
|
|
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
No exemplo abaixo estamos utilizando um json padrão para o post.
|
|
Observe no Log a informação da idempotência
O processo de idempotência entrou automaticamente para proteger esse request HTTP sem a necessidade de nenhuma informação do lado do consumidor da API.
Efetue um segundo um post idêntico pela API Order
Ao observar esse segundo cenário já é possivel perceber que a idempotência protegeu o microsserviço impedindo uma inclusão duplicada.
A API já recebeu um retorno rejeitando o POST duplicado
Ao analisar o Log nós conseguimos acompanhar todo o processo da idempotência
Iniciando a idempotência manual no microsserviço
O Devprime permite que você informe manualmente um método especifico que terá o suporte a idempotência. O primeiro passo é alterar a configuração principal e depois ir diretamente no método para adicionar a configuração.
** Alterando a chave “Action” para “Manual”**
|
|
Ao utilizar a opção “Action” como “manual” se rodar novamente o microsserviço e fizer um post duplicado irá perceber que ele não vai rejeitar, pois o processo automático está desligado.
** Ativando a idempotência em um método**
Como o processo agora está manual nós ativaremos idempotência em cada método a ser protegido. No exemplo abaixo nós demonstramos essa possibilidade diretamente no Adapter Web.
code src\Adapters\Web\Order.cs
Localize no Adapter Web a API “Order” e efetue a modificação conforme apresentado.
|
|
Execute novamente e vai perceber que voltou a funcionar o recurso de idempotência, porém apenas para o POST na API “/v1/order”.
Mais artigos sobre idempotência
Implementing idempotency in microsserviços
Idempotency in microsserviços and REST APIs