Building an idempotent event-driven microsserviços
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 e paymentevents no RabbitMQ.
- Crie um novo microsserviço seguindo o exemplo do “payment” apresemtado.
- Esse microsserviço escutará a fila/tópico “orderevents”
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
|
|
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
|
|
Para esse cenário nós adicionaremos o evento diretamente no RabbitMQ para simularmos uma duplicidade de eventos.
Execute o microsserviço dp-stream e entre no portal do Rabbitmq em
http://localhost:15672 com o usuário guest/guest. Localize o menu Queues > orderevents e localize o item “Publish message”
Localize o campo payload e cole o json abaixo e dpeois vá em “Publish message” para colocar esse evento na fila.
|
|
O microserviço está escutado essa fila e já vai reagir ao evento e processar com sucesso.
Agora retorne ao RabbitMQ e envie novamente o mesmo evento e vai observar que ao chegar ao microsserviço ele é rejeitado automaticamente.
Para repetir o teste altere um valor no Payload do json colocando um outro guid no ID por exemplo.
Iniciando a idempotência manual
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”**
|
|
No modo manual ao efetuar um teste enviando eventos duplicados vai observar que eles serão aceitos. Você precisa visitar cada método desejado e adicionar “Dp.Idempotency.Enable = true;” para a habilitar o controle de idempotência.
** Modificando o Stream para ter idempotência"**
Abra o Hub de eventos e localizar o subscribe do evento desejado que nesse contexto é o “OrderCreated” e adicine o “Dp.Idempotency.Enable = true;”.
code src\Adapters\Stream\EventStream.cs
|
|
Ao tentar executar novamnente com eventos duplicados já vai perceber que voltou a funcionar.
Mais artigos sobre idempotência
Idempotency in microsserviços and REST APIs
Building an idempotent event-driven microsserviços