Skip to content

[Documentação] ADR da solução do conversor de moedas

Eugenio Sales Siqueira edited this page Oct 19, 2022 · 13 revisions

Contextualização e Definição do Problema

O objetivo desse projeto foi fazer um microsserviço privado de conversão de moedas para ser utilizado por outras API's que necessitem do serviço. No caso do projeto, para demonstração, foi contruído um microsserviço externo para listagem de produtos que consulta o microsserviço de conversão de moedas para apresentação do preço do produto (BRL) para a moeda de interesse do usuário.

Motivadores de Decisão

  • Permitir que a aplicação consiga exibir o valor dos produtos em diferentes moedas a partir do real (BRL);
  • Immpactar minimamente a experiência do usuário com latência adicional ou falha na requisição do serviço externo;

Resultado da decisão

  1. Inicialmente, a lambda "UpdateExchangeRate" é disparada por meio de uma rule do eventBridge a cada 1 minuto;

  2. O evento é redirecionado da fila para a lambda updateExchangeRate que:

  • A lambda checa o estado do Circuit Breaker (OPEN ou CLOSED);
  • Caso esteja aberto ou apto para verificar se a API external encontra-se disponível novamente, é feita uma requisição a API externa da Exchange Rates para obtenção da cotação das moedas;
  • A resposta da API é salva (cacheada) na tabela ExchangeRate do DynamoDB;
  • Caso seja lançada uma excessão na requisição da API Externa, o Circuit Breaker assumirá estado de fechado e uma nova tentativa de requisição só será permitida depois de um número determinado de milisegundos (Ex.: 300000ms);
  1. Uma vez que haja requisição da listagem de produtos por parte do usuário seja via mobile ou web:
  • A lambda getProducts, responsável por retornar uma lista de produtos da tabela Product, faz uma requisição síncrona ao microsserviço de cotações de moedas;
  • É retornado a lista de produtos com os preços calculados de acordo a moeda corrente.

Consequência Positivas

  • Arquitetura distribuída e desacoplada para permitir reutilização do microsserviço de conversão;
  • Job para atualização das taxas e persistência em um banco para diminuir número de chamadas na API Externa
  • Permitir que os dados já fiquem "cacheados" em caso de possíveis falhas;
  • Em caso de indiponibilidade da API externa, há um controle de disjuntor para evitar chamadas desnecessárias até que a API externa fique disponível novamente;

Consequência Negativas

  • Tempo de processamento do fluxo inteiro maior devido criação de novos microserviços.
  • Acréscimo de pontos de falha devido a criação de mais microsserviços;

Pontos de melhoria

  • Para melhorar a velocidade do microsserviço de consulta das taxas de câmbio (GetExchangeRate), poderia substituir a tabela ExchangeRate do DynamoDB por um banco em memória como o Redis (Instância do Elasticache);
  • No tratamento do Circuito Fechado, poderia ser adicionado uma API de "backup" para consulta dos dados dependendo do tempo de indisponibilidade da API externa principal;
  • O tempo de atualização planejado é de 1 minuto devido ser a taxa de atualização mais rápida da API escolhida (Enterprise plan). No entanto, poderia ser observado no mercado outras alternativas com taxa de atualização superior;
  • Adição de serviço de observabilidade como o New Relic. No código, é feito uma referência por meio de log de como o serviço seria utilizado, mas para essa POC, não foi aplicado.

Arquitetura da solução

  • Os eventos são apresentados sequencialmente de acordo o diagrama abaixo e também pode ser visualizado por meio do link: Url do Diagrama

Logo

Prós e contras da solução

  • Bom, pois cada serviço está alocado no domínio específico;
  • Bom, pois desacopla os serviços;
  • Bom, pois o sistema é tolerante a falha;
  • Ruim, pois acrescenta vários pontos a mais para serem analisados em caso de falha;

Observações

  • A rule update-exchange-rate-rule localizada no arquivo event-rule.tf encontra-se com o schedule para cada 20 dias para evitar cobranças adicionais da AWS. No entanto, é possível observar uma linha com a taxa definida em 1 minuto como planejado.

Links