<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Leonardo Barreto</title>
    <description>The latest articles on Forem by Leonardo Barreto (@oleobarreto).</description>
    <link>https://forem.com/oleobarreto</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1019528%2Fea5aec53-f183-451d-b922-95719c3245cd.jpg</url>
      <title>Forem: Leonardo Barreto</title>
      <link>https://forem.com/oleobarreto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/oleobarreto"/>
    <language>en</language>
    <item>
      <title>Latência: O que é e como pode prejudicar uma aplicação</title>
      <dc:creator>Leonardo Barreto</dc:creator>
      <pubDate>Thu, 12 Feb 2026 22:14:07 +0000</pubDate>
      <link>https://forem.com/oleobarreto/latencia-o-que-e-e-como-pode-prejudicar-uma-aplicacao-a8b</link>
      <guid>https://forem.com/oleobarreto/latencia-o-que-e-e-como-pode-prejudicar-uma-aplicacao-a8b</guid>
      <description>&lt;p&gt;Um problema que sempre nos deparamos quando temos um software de grande demanda de usuários e integrações com outros sistemas é a latência de respostas, que é um tempo de delay nas respostas de requisições HTTP, ou em uma query rodando no banco de dados. Esse “delay” pode parecer algo normal e que sempre está presente, porém quando temos estruturas mal planejadas ou queries não otimizadas esse tempo de latência aumenta, e então nos deparamos com uma lentidão enorme no sistema, causando a abertura de novos chamados pelo cliente e até usuário parando de usar o sistema, o que causa um impacto direto no financeiro da sua empresa. Onde de acordo com um artigo divulgada pela &lt;em&gt;Amazon&lt;/em&gt; em 2008 menciona que a cada 100ms de latência pode impactar em 1% das vendas.&lt;/p&gt;

&lt;p&gt;Sabemos então o que é a latência e como ela pode impactar negativamente um sistema, mas como identificar qual a real latência do sistema? Para isso podemos aplicar um padrão chamado &lt;em&gt;Long Tail Latency&lt;/em&gt;, uma forma de observar o real impacto para os usuários.&lt;/p&gt;

&lt;p&gt;Para criar um gráfico de &lt;em&gt;Long Tail Latency&lt;/em&gt;, precisamos analisar alguns dos processos mais utilizados no sistema, onde no meu caso utilizei como dado amostral 20 queries distintas, e então anotamos seus tempos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp68t2r7clsyluklpyde9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp68t2r7clsyluklpyde9.png" alt=" " width="256" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora organizando esses dados de forma crescente podemos começar a descobrir os pontos que chamamos de: p50, p75, p90, p99, p99.9. Que indicam respectivamente o tempo médio de latência de uma query, as 25% das queries mais lentas, os 10% das queries mais lentas, até chegarmos a casos extremos que seriam o 0,1% das queries do sistema. Para o p50 podemos utilizar a mediana que descobrimos com base na nossa amostra, para os demais pontos, podemos utilizar a seguinte formula:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;(ponto ÷ 100) × Total de amostras = posição&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dessa forma descobriremos os pontos de latência para cada cenário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0y0u87t6hm0al6bvmltf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0y0u87t6hm0al6bvmltf.png" alt=" " width="345" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E por fim podemos criar um gráfico para podermos analisar melhor o que esses dados representam.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqtkdmt5gtvh8yad935v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqtkdmt5gtvh8yad935v.png" alt=" " width="400" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Analisando os resultados do teste:
&lt;/h2&gt;

&lt;p&gt;Podemos analisar com o gráfico de percentual de latência que na média o usuário tem uma latência de 188ms de respostas de cada queries que rodam no sistema. Porém vemos como é exponencial o aumento do tempo de resposta, onde as 25% das queries mais lentas do sistema demora 1,3 segundos para rodar, e caso olharmos os piores cenários, temos uma latência de 6 segundos ou mais, o que está muito longe de um cenário ideial.&lt;/p&gt;

&lt;p&gt;Portanto com esses dados em mãos podemos criar planos de ação para curto, médio e longo prazo e tomar decisões mais assertivas para a evolução do sistema. Como implementar algoritmos de cache, refatorar códigos repetitivos ou até mesmo planejar uma arquitetura mais performática e eficiente, garantindo facilidade de manutenção e feedbacks mais positivos do cliente final.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>Autenticação Stateful x Stateless</title>
      <dc:creator>Leonardo Barreto</dc:creator>
      <pubDate>Wed, 18 Sep 2024 00:35:56 +0000</pubDate>
      <link>https://forem.com/oleobarreto/autenticacao-stateful-x-stateless-e8i</link>
      <guid>https://forem.com/oleobarreto/autenticacao-stateful-x-stateless-e8i</guid>
      <description>&lt;h2&gt;
  
  
  Arquitetura Stateless e Stateful
&lt;/h2&gt;

&lt;p&gt;Refere-se ao &lt;strong&gt;estado da aplicação&lt;/strong&gt;, ou seja, à &lt;strong&gt;condição&lt;/strong&gt; ou &lt;strong&gt;qualidade&lt;/strong&gt; dela em um determinado momento. Em uma autenticação &lt;code&gt;stateless&lt;/code&gt;, não existe uma sessão ou usuário armazenado, contendo apenas &lt;strong&gt;conteúdos estáticos&lt;/strong&gt;. Isso difere do &lt;code&gt;stateful&lt;/code&gt;, que se trata de um &lt;strong&gt;conteúdo dinâmico&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Um processo &lt;code&gt;stateless&lt;/code&gt; é um recurso isolado, que não faz referência a nenhum outro serviço ou interação com outro sistema. Ele opera apenas naquela parte do código, sem trazer informações de transações antigas, pois a autenticação &lt;code&gt;stateless&lt;/code&gt; &lt;strong&gt;não armazena esse tipo de dado&lt;/strong&gt;; cada &lt;strong&gt;operação é feita do zero&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A autenticação &lt;code&gt;stateful&lt;/code&gt; permite que as informações sejam &lt;strong&gt;utilizadas mais de uma vez&lt;/strong&gt; e são executadas com base no &lt;strong&gt;contexto das transações anteriores&lt;/strong&gt;. Por isso, em aplicações onde se necessita aguardar uma resposta ou um &lt;strong&gt;dado preexistente&lt;/strong&gt;, seja ele presente em outro sistema ou base de dados, utiliza-se o &lt;code&gt;stateful&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autenticação Stateless
&lt;/h2&gt;

&lt;p&gt;A autenticação &lt;code&gt;stateless&lt;/code&gt; consiste em uma estratégia na qual, após informar as credenciais, o usuário recebe um token de acesso como resposta. Esse token já contém todas as informações necessárias para identificar o usuário que o gerou, sem a necessidade de consultar continuamente o serviço que emitiu o token ou uma base de dados.&lt;/p&gt;

&lt;p&gt;Esse token é &lt;strong&gt;armazenado do lado do cliente&lt;/strong&gt; (navegador), de modo que o servidor só tem a capacidade de verificar a validade do token, confirmando se o payload e a assinatura correspondem.&lt;/p&gt;

&lt;h3&gt;
  
  
  JWT de autenticação Stateless
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JSON Web Token (JWT)&lt;/strong&gt; são chaves com padrões estabelecidos na &lt;strong&gt;RFC-7519&lt;/strong&gt;, contendo uma entidade em forma de declarações, que são independentes, sem a necessidade de chamar o servidor para revalidar o token.&lt;/p&gt;

&lt;p&gt;São strings codificadas no padrão base64 por meio de uma &lt;strong&gt;secret key&lt;/strong&gt;, como no exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6apt7bzhy7jk2dtre7x1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6apt7bzhy7jk2dtre7x1.png" alt=" " width="699" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens e Desvantagens
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Vantagens:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Baixo consumo de memória do servidor.&lt;/li&gt;
&lt;li&gt;Excelente em termos de escalabilidade.&lt;/li&gt;
&lt;li&gt;Ideal para aplicações distribuídas, como APIs e microsserviços.&lt;/li&gt;
&lt;li&gt;Geração e distribuição do token em uma aplicação isolada, sem dependência de terceiros.&lt;/li&gt;
&lt;li&gt;Facilidade na interpretação e validação dos dados do usuário do token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dificuldade no controle de acesso.&lt;/li&gt;
&lt;li&gt;Não é possível revogar o token a qualquer momento com facilidade.&lt;/li&gt;
&lt;li&gt;Pode facilitar a entrada de terceiros mal-intencionados, caso alguém tenha acesso ao token.&lt;/li&gt;
&lt;li&gt;A sessão não pode ser alterada até a expiração do token.&lt;/li&gt;
&lt;li&gt;O token JWT é mais complexo e pode se tornar desnecessário em aplicações centralizadas, como monolitos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Autenticação Stateful
&lt;/h2&gt;

&lt;p&gt;Comumente utilizada em várias aplicações, principalmente naquelas que não exigem tanta escalabilidade, a sessão com estado é criada no &lt;strong&gt;back-end&lt;/strong&gt; da aplicação, e a referência da sessão é enviada de volta ao usuário correspondente. Cada vez que o usuário faz uma requisição, uma parte da aplicação gera o token. A partir desse momento, a cada nova requisição, esse token será enviado novamente para a aplicação para revalidar o acesso. Nesse modelo, caso haja alguma alteração nos dados do usuário, o token pode ser facilmente revogado.&lt;/p&gt;

&lt;p&gt;São tokens de acesso opacos, ou seja, uma &lt;strong&gt;string simples&lt;/strong&gt; de formato proprietário que não contém qualquer identificador ou dado do usuário referente àquele token. O destinatário precisa chamar o servidor que criou o token para validá-lo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Exemplo de token: &lt;code&gt;8c90e55a-e867-45d5-9e42-8fcbd9c30a74&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse ID deve ser armazenado em alguma base de dados junto ao usuário proprietário do token.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens e Desvantagens
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Vantagens:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lógica de implementação centralizada.&lt;/li&gt;
&lt;li&gt;Gestão e controle de acesso simplificados.&lt;/li&gt;
&lt;li&gt;Excelente para monolitos, aplicações MVC e processos internos.&lt;/li&gt;
&lt;li&gt;Mais seguro contra terceiros mal-intencionados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pode ocorrer uma sobrecarga na API responsável por validar o token.&lt;/li&gt;
&lt;li&gt;Falha no quesito escalabilidade.&lt;/li&gt;
&lt;li&gt;Maior dificuldade em distribuir a autenticação entre microsserviços.&lt;/li&gt;
&lt;li&gt;Em uma aplicação distribuída, caso o serviço de autenticação falhe, todos os outros serviços ficam indisponíveis.&lt;/li&gt;
&lt;li&gt;Maior complexidade de implementação.&lt;/li&gt;
&lt;li&gt;Maior dificuldade de integração com sistemas de terceiros.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quando utilizar cada abordagem?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quando utilizar um Token JWT e Autenticação Stateless
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Quando é necessária maior performance sem a preocupação com a sobrecarga de uma API.&lt;/li&gt;
&lt;li&gt;Quando se tem várias comunicações distribuídas entre serviços.&lt;/li&gt;
&lt;li&gt;Quando é preciso identificar qual usuário está realizando uma ação no sistema em diferentes serviços.&lt;/li&gt;
&lt;li&gt;Quando não se pretende persistir dados de um usuário, apenas seu registro inicial.&lt;/li&gt;
&lt;li&gt;Se for preciso gerar acessos externos ao serviço.&lt;/li&gt;
&lt;li&gt;Se for necessário manipular os dados de quem está realizando uma determinada ação com o mínimo de impacto no sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quando utilizar um Token Opaco e Autenticação Stateful
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Se for necessário o controle total de acesso dos usuários de um sistema, principalmente para definição de hierarquia de acesso.&lt;/li&gt;
&lt;li&gt;Em uma aplicação centralizada, sem serviços distribuídos e sem comunicação com serviços externos.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Considerações Finais:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Em alguns trechos, como "estrese da API", o termo pode ser substituído por "sobrecarga da API" para maior clareza.&lt;/li&gt;
&lt;li&gt;A seção sobre "Token JWT" poderia incluir uma explicação mais detalhada sobre o que são as "declarações" mencionadas na RFC-7519, caso o público-alvo precise de mais contexto.&lt;/li&gt;
&lt;li&gt;Na seção sobre autenticação &lt;code&gt;stateful&lt;/code&gt;, a frase "uma parte de aplicação irá gerar o token" poderia ser esclarecida explicando qual parte específica da aplicação é responsável por isso.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>stateful</category>
      <category>stateless</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
