DEV Community

Francisco Zanfranceschi
Francisco Zanfranceschi

Posted on

6

[Desafio] - Diminuir Problemas de Acoplamento

Conteúdo original em https://twitter.com/zanfranceschi/status/1572256034340868097


Ei dev,

Pra você que curte um desafio de System Design, pega esse aqui!

O desafio é melhorar uma integração com muitas falhas com um parceiro; idealmente diminuindo o acoplamento temporal.

Cola mais pros detalhes.

cc @sseraphini

Image


VISÃO GERAL

Esses desenhos mostram um pouco da integração entre DOLLARZ (o serviço do seu time) e COTAÇÃO DO DÓLAR (o serviço de terceiros que oferece a cotação do dólar do dia).

(Pra simplificar o desafio, a premissa é de que o dólar é cotado diariamente apenas.)

Image

Image


Rápida explicação sobre a nomenclatura CACHE MISS (e HIT):

CACHE MISS: é quando a informação não é encontrada no cache, seja pela expiração do item, seja pela aplicação não estar "aquecida".

CACHE HIT: quando a informação é encontrada no cache.


PROBLEMA

O horário do dia em que a cotação muda é instável (pode ser de manhã, de noite, ninguém sabe... esse serviço de cotação do dólar é realmente ruim). O melhor que o seu novo time pôde fazer foi manter um cache de uma hora, mas mesmo assim há muitas falhas (HTTP 500).


Essas falhas refletem no aumento das chances de mostrar a cotação errada do dólar para seus usuários. E isso acarreta em muita operação para correção e frustração dos usuários (as compras com a cotação incorreta são desfeitas).


DESAFIO

Tendo a liberdade total de mudança/criação do seu lado (DOLLARZ), o que poderia ser feito para melhorar a experiência do usuário e diminuir a operação de correções de inconsistências?


PREMISSAS

  • Nada pode ser alterado no serviço COTAÇÃO DO DÓLAR;

  • A área de engenharia preza pelo desacoplamento temporal ou, pelo menos, sua diminuição – tente ir nessa linha;

+


  • O seu time notou que quando as falhas começam a ocorrer na integração (respondendo com erros HTTP 500), após cerca de 20 requisições, o serviço se restabelece (é, estranho mesmo).

O que DOLLARZ faz realmente não está bem descrito, mas isso não deveria ser um problema pra esse desafio fictício – foque no problema específico da integração. Não existe o jeito certo, não tem pegadinha. É apenas um exercício e faça como quiser!


Seria legal demais se postasse aqui seu desenho da solução.

Se leu até aqui, dá um abraço aqui ó 🫂

Muito obrigado pela moral! ♥️

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (1)

Collapse
 
saraiva1989 profile image
Daniel Saraiva • Edited

🫂
Não sei se seria a melhor forma, mas como temos um parâmetro para iniciar a solução (após um erro 500 depois de 20 requisições retorna) vejo três maneiras de resolver isso.

  1. Talvez ter um outro serviço de cotação e caso o primeiro falhe, buscar a informação do outro serviço. Nesse caso você teria um backup caso ocorra falhas. Como existem diversas API de cotação de moeda, talvez fosse uma boa saida.

  2. A maneira que poderia ser feito por exemplo é ter uma outra aplicação que roda a cada minuto por exemplo com a responsabilidade apenas de atualizar o cache. Essa aplicação não estará ligado direto ao usuário final. Caso a atualização do cache receba falha, pode ter a rotina para executar as "20 vezes" até deixar de retornar o erro 500.

  3. e por fim seria nesse mesma aplicação, caso a chamada da API receba um erro 500, iniciar uma task paralela que irá fazer as "20 request" na API que ocorre o erro 500.

Agora se fosse um problema real, talvez a solução ideal seria buscar um fornecedor que tenha uma API de cotação melhor rsrs.

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay