Skip to content

Definir um timeout em integrações e uma boa prática

Veja nesse artigo por que aplicar o padrão Timeout em integrações é uma boa pratica para se evitar efeitos colaterais e como achei e resolvi esse problema.

Você pode estar trabalhando em sistemas monolíticos e mesmo assim ter um sistema distribuído que ajuda seu sistema principal em alguma tarefa. Minha dica é, tome cuidado com esta integração por que seu sistema irá ser afetado em algum momento e neste artigo eu explico por que.

O problema

Nesta semana, meu time e eu tivemos um problema com uma integração que nosso sistema faz com outro sistema. Antes de falar do problema, vou fazer um resumo do sistema que eu trabalho para depois explicar como encontrei o problema.

O sistema que eu trabalho tem a função de gerenciar documentos do cliente. O cliente insere documentos e a qualquer documento ele pode ser buscado ou assinado com um fluxo que há na aplicação. Basicamente esse é o core do sistema, mas com mais funcionalidades.

Quando eu insiro um documento, ele precisa ser armazenado em algum lugar e para isso, usamos a ferramenta min.io. Com o min.io, a aplicação pode armazenar em qualquer lugar, como Google, Azure, AWS, Local e outros. Eu não preciso criar uma instrução de código para cada solução.

Estamos usando o min.io a mais de um ano e estamos gostando justamente por que não precisamos criar várias implementações e assim podemos focar no nosso core.

Mas esta semana tivemos um problema reportado pelo cliente para visualizar documentos. Estava muito lento para visualizar. Então, se é problema para visualizar, eu logo visualizei que o problema seria no min.io. Para ter certeza, acessei o min.io server e para minha surpresa tudo estava funcionando e rápido. Mas então qual era o problema? Minha aplicação? Para analisar melhor, eu abri o Application Insights Monitor e lá eu vi que a conexão entre o min.io estava lenta.

Geralmente, a conexão do min.io responde em 50ms. Eu sei disso por que eu tenho um histórico dessas informações no Application Insights. Mas naquele dia, ele estava respondendo em 10min. Que porra estava acontecendo? Em resumo, o problema estava entre meu sistema e o min.io. Seria network? Talvez.

Se você não tem um sistema de monitoramento, você não irá descobrir este problema.

Alt Text

Eu comecei a ver todas as conexões com o min.io e eu vi muitas conexões longas, você pode ver isso na imagem acima. Com essa analise, cheguei a conclusão que o problema não era o min.io e sim a rede entre a aplicação e o min.io server.

Falando do problema agora, o que ele trouxe de problema para a aplicação? O sistema estava aguardando por uma resposta do min.io, portanto ele estava aguardando vários minutos. Você deve saber que um servidor web tem um numero finito de treads para processar as requisições do usuários e com este problema, muitas treads estavam presas com conexões com o min.io. O efeito colateral era que a minha aplicação não poderia atender outros usuários. Você entendeu o problema?

Se você ler as falacias da computação distribuída, você irá ver que a rede não é confiável, então nos devemos sempre prevenir qualquer problema que aconteça, mas como? Vamos pensar juntos, Eu não sou o proprietário do min.io (Ele é um serviço externo) e nem da rede (O meu cliente é o dono da rede), mas eu sou o proprietário do meu sistema, então, nós podemos trabalhar em nosso sistema para ficar mais “esperto”.

Definir um timeout

Você já sabe que qualquer sistema irá falhar ou ficar lento em algum momento, então demos prevenir sempre que possível para que isso não aconteça. Em nosso caso, o problema foi a rede, poderia ser latencia ou largura da banda, já que essa rede é utilizada por vários serviços. Para isso existe o padrão Timeout, onde ele irá cortar a conexão e ajudar o sistema a falhar mais rápido em vez de criar o efeito dominó.

Existe muitas bibliotecas que usam esse padrão de timeout para qualquer linguagem. Eu trabalho com o .Net e eu uso o Polly, http://www.thepollyproject.org. Minha dica é, não invente a roda, nunca tente criar sua própria ferramenta quando ela já existe e é free :). Por favor, repita comigo, “Eu não irei criar minha própria ferramenta”. Lembre-se, existe pessoas que são mais espertas no assunto do que eu e você e elas já fizeram o trabalho todo para contornar o problema.

Definir um tempo limite para meu sistema se comunicar com outro sistema é uma prática já usada por várias empresas e muitos falam no termo “falhar rapido”, que é quando meu sistema falha graciosamente e não faz o usuário final esperar por tanto tempo. Imagina no cenário que eu falei acima, esperar 10min para abrir um documento, chega a ser ridiculo, mas infelizmente aconteceu.

Qual o tempo limite que eu devo definir? Isso é uma coisa sua e do seu time, não existe regra. Acredito que o negócio pode dar seu pitaco para chegar a um número.

Causa raiz não resolvida

Você pode estar pensando, OK, posso definir um timeout para que em casos de problema de rede, não fique a vida toda consumindo minha thread por uma conexão. Mas fazendo isso eu não resolvo o problema, não deveria a infra ser avisada/responsável do problema de rede?

Concordo, a equipe de infra estrutura deve sempre ser avisa quando esse tipo de problema acontece. Mas mesmo que tenhamos a melhor equipe de infra estrutura do mundo, esse problema não será evitado. Tenha isso muito forte em sua mente, problemas em sistemas distribuídos irão sempre acontecer e definindo um timeout eu estou isolando um problema para que o resto da minha aplicação ainda possa atender outras funcionalidades.

Não concordo 100% que a equipe de infra é sozinha responsável, acredito que como time todos são responsáveis pela aplicação, mesmo que com problemas externos. Você pode perceber que eu só consegui encontrar o problema por que fui auxiliado pelo nosso sistema de monitoramento e não ter esse tipo de ferramenta hoje em dia, é quase que dirigir um carro com os olhos vedados.

Em um próximo post eu irei mostrar como eu resolvi o problema usando a biblioteca Polly.

Galera, por hoje é isso e espero ter ajudado. Abraços e até a próxima.

Quer fazer um curso de TDD ou DDD a um preço super barato? Acesse um dos meu cursos https://www.udemy.com/user/stephany-henrique-de-almeida-batista/ e começe hoje mesmo!

Published inQualidade de software

Be First to Comment

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *