<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Leonardo Moreno]]></title><description><![CDATA[Tech Lead apaixonado por novas tecnologias e entusiasta do mercado financeiro]]></description><link>https://leonardomoreno.com.br</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 14:12:00 GMT</lastBuildDate><atom:link href="https://leonardomoreno.com.br/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Guia para escalar seu App - parte 3]]></title><description><![CDATA[Nas duas primeiras partes desta série, exploramos a abordagem tradicional para criar e dimensionar um aplicativo. Começou com um único servidor que executava tudo e, gradualmente, evoluiu para uma arquitetura de microsserviço que poderia suportar mil...]]></description><link>https://leonardomoreno.com.br/guia-para-escalar-seu-app-parte-3</link><guid isPermaLink="true">https://leonardomoreno.com.br/guia-para-escalar-seu-app-parte-3</guid><category><![CDATA[frontend]]></category><category><![CDATA[serverless]]></category><category><![CDATA[API Gateway]]></category><category><![CDATA[scalability]]></category><category><![CDATA[architecture]]></category><dc:creator><![CDATA[Leonardo Moreno]]></dc:creator><pubDate>Sun, 26 Mar 2023 17:51:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1679798355394/c735ce8b-538f-4f34-8491-3c731d463ef6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Nas duas primeiras partes desta série, exploramos a abordagem tradicional para criar e dimensionar um aplicativo. Começou com um único servidor que executava tudo e, gradualmente, evoluiu para uma arquitetura de microsserviço que poderia suportar milhões de usuários ativos diariamente.</p>
<p>Nas duas partes finais desta série, examinamos o impacto de tendências recentes, como computação em nuvem e sem servidor, juntamente com a proliferação de estruturas de aplicativos cliente e o ecossistema de desenvolvedores associado. Exploramos como essas tendências alteram a maneira como construímos aplicativos, especialmente para startups em estágio inicial, onde o tempo de colocação no mercado é crítico, e fornecemos informações valiosas sobre como incorporar essas abordagens modernas ao criar seu próximo grande sucesso.</p>
<h1 id="heading-tendencias-recentes"><strong>Tendências Recentes</strong></h1>
<p>Vamos começar explicando brevemente essas tendências de computação que mencionamos.</p>
<p>A primeira tendência é <strong>a computação em nuvem</strong>. A computação em nuvem, em sua forma mais básica, está executando aplicativos em recursos de computação gerenciados por provedores de nuvem. Ao usar a computação em nuvem, não precisamos comprar ou gerenciar hardware por nós mesmos.</p>
<p>A segunda tendência é <strong>a computação sem servidor</strong>. A computação sem servidor baseia-se na conveniência da computação em nuvem com ainda mais automação. Ele permite que os desenvolvedores criem e executem aplicativos sem precisar provisionar servidores em nuvem. O provedor sem servidor lida com a infraestrutura e dimensiona automaticamente os recursos de computação para cima ou para baixo, conforme necessário. Isso fornece uma ótima experiência de desenvolvedor, já que os desenvolvedores podem se concentrar no próprio código do aplicativo, sem ter que se preocupar com o dimensionamento.</p>
<p><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F612e00aa-6ce3-46bc-8383-563bc53a750e_1600x691.png" alt /></p>
<p>A terceira tendência surfa nas ondas das duas primeiras. É a proliferação das estruturas de aplicativos <strong>cliente e das plataformas de hospedagem</strong> front-end que tornam a implantação desses aplicativos front-end fácil.</p>
<h1 id="heading-frameworks-front-end-modernos-e-plataformas-de-hospedagem"><strong>Frameworks front-end modernos e plataformas de hospedagem</strong></h1>
<p>Vamos investigar um pouco mais a terceira tendência.</p>
<p>Nos últimos anos, tem havido uma mudança significativa na forma como as aplicações web são construídas. Muitos dos aplicativos populares de hoje são o que é chamado de Aplicativo de Página Única (SPA).</p>
<p>Um SPA fornece uma experiência de usuário mais perfeita, atualizando dinamicamente a página atual em vez de carregar uma nova cada vez que o usuário interage com o aplicativo. Em um SPA, o HTML inicial e seus recursos são carregados uma vez e as interações subsequentes com o aplicativo são tratadas usando JavaScript para manipular o conteúdo da página existente.</p>
<p>A maneira tradicional de criar aplicativos da web, como a que discutimos anteriormente para nossa empresa de comércio eletrônico Llama, envolvia a veiculação de novas páginas HTML do servidor toda vez que o usuário clicava em um link ou enviava um formulário. Esse modelo convencional é conhecido como MPA (Multi-Page Application). Cada solicitação de página normalmente envolve uma atualização de página inteira, que pode ser lenta e, às vezes, perturbadora para a experiência do usuário.</p>
<p>Por outro lado, um SPA carrega o quadro HTML inicial do aplicativo e, em seguida, faz solicitações ao servidor para obter dados, conforme necessário. Essa abordagem permite um uso mais eficiente dos recursos do servidor. O servidor não está constantemente enviando páginas HTML completas e pode se concentrar em servir dados por meio de uma API bem definida.</p>
<p>Outro benefício da abordagem centrada em API de um SPA é que a mesma API é frequentemente compartilhada com aplicativos móveis, tornando o back-end mais fácil de manter.</p>
<p>Os SPAs geralmente são criados usando estruturas JavaScript como o React. Essas ferramentas fornecem um conjunto de abstrações e ferramentas para a criação de aplicativos complexos que são otimizados para desempenho e capacidade de manutenção. Por outro lado, a criação de um MPA requer uma abordagem mais centrada no servidor, o que pode ser mais desafiador de dimensionar e manter à medida que o aplicativo cresce em complexidade.</p>
<p><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F938d190b-9029-40c5-b9cf-2e7af989c379_1600x709.png" alt /></p>
<p>O aumento da popularidade dessas estruturas de cliente trouxe uma ampla gama de plataformas de hospedagem front-end de nível de produção para o mercado. Alguns exemplos populares incluem Netify e Vercel. Os principais provedores de nuvem têm ofertas semelhantes.</p>
<p>Essas plataformas de hospedagem lidam com a complexidade de criar e implantar aplicativos front-end modernos em escala. Os desenvolvedores verificam seu código em um repo e as plataformas de hospedagem assumem o controle a partir daí. Eles criam automaticamente o pacote de aplicativos Web e seus recursos associados e os distribuem para a CDN.</p>
<p>Como essas plataformas de hospedagem são construídas sobre a base de computação em nuvem e sem servidor, usando práticas recomendadas, como servir dados na borda perto do usuário, elas oferecem escala praticamente infinita e não há infraestrutura para gerenciar.</p>
<p>É assim que o cenário de frontend moderno se parece. O aplicativo front-end é construído com uma estrutura moderna como o React. O aplicativo cliente é atendido por uma plataforma de hospedagem de nível de produção para dimensionamento e busca dinamicamente dados do back-end por meio de uma API bem definida.</p>
<p><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd388e37-2941-480f-b31c-6233218911fa_1600x588.png" alt /></p>
<h1 id="heading-opcoes-modernas-de-back-end"><strong>Opções modernas de back-end</strong></h1>
<p>Como mencionado na seção anterior, a função de um back-end moderno é servir a um conjunto de APIs bem definidas para oferecer suporte à Web de front-end e aplicativos móveis.</p>
<p>Quais são as opções modernas para criar um back-end? A mudança é igualmente dramática.</p>
<p>Vamos ver o que uma startup pequena e com recursos limitados deve usar para criar seu back-end e ver até que ponto esse back-end poderia escalar.</p>
<p>Quando o tempo de colocação no mercado é crítico e os recursos são limitados, uma startup deve descarregar o máximo de trabalho não essencial possível. As opções de computação sem servidor são atraentes, pelas seguintes razões:</p>
<ul>
<li><p>A computação sem servidor gerencia os aspectos operacionais do back-end, como dimensionamento, redundância e failover, liberando a equipe de inicialização do gerenciamento da infraestrutura.</p>
</li>
<li><p>A computação sem servidor segue um modelo de preços pay-per-use econômico. Não há compromisso inicial.</p>
</li>
<li><p>A computação sem servidor permite que os desenvolvedores se concentrem em escrever código e testar o back-end sem se preocupar com o gerenciamento de servidores, levando a um menor tempo de comercialização.</p>
</li>
</ul>
<h2 id="heading-opcoes-de-computacao-sem-servidor-serverless"><strong>Opções de computação sem servidor (serverless)</strong></h2>
<p>Existem dois tipos populares de opções de computação sem servidor adequadas para uma inicialização - funções de nuvem, como AWS Lambda e Google Cloud Functions, ou plataformas de contêiner gerenciado, como o Google Cloud Run ou o AWS App Runner.</p>
<p>Vamos explorar cada um deles.</p>
<p>As funções de nuvem são plataformas de computação sem servidor projetadas para lidar com a lógica de aplicativos simples. É adequado para aplicações que exigem execução rápida e simples.</p>
<p>As funções de nuvem são dimensionadas automaticamente com base no volume de solicitações. Eles têm um modelo de programação de solicitação/resposta simples. No entanto, as funções de nuvem são geralmente limitadas a um pequeno número de linguagens de programação populares.</p>
<p>As funções de nuvem devem ser capazes de escalar para milhares de solicitações simultâneas. Se o tempo de execução estiver disponível para seu ambiente de programação específico, as funções de nuvem seriam uma boa escolha.</p>
<p><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff148f025-3ac3-4731-b39d-c386a7df65b6_1600x1289.png" alt /></p>
<p>As plataformas de contêiner gerenciado são semelhantes às funções de nuvem. A principal diferença é que essas plataformas suportam mais ambientes de tempo de execução. Somos livres para escolher a maioria dos ambientes de programação.</p>
<p>O modelo de programação para uma plataforma de contêiner gerenciado é mais convencional e flexível. Em vez do modelo simples de solicitação/resposta das funções de nuvem, uma plataforma de contêiner gerenciado pode executar qualquer programa dentro de um contêiner. Para uma carga de trabalho de servidor de API, cada contêiner é executado como um servidor sem monitoração de estado típico de longa duração. A plataforma de contêiner gerenciado distribui a carga entre os contêineres e lida com o dimensionamento e o failover automaticamente.</p>
<p>As plataformas de contêiner gerenciado são uma escolha melhor se o aplicativo exigir ambientes de tempo de execução mais complexos ou um modelo de programação mais flexível.</p>
<p><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954acfe4-df78-4f71-8aeb-d676e55907cf_1600x1418.png" alt /></p>
<h2 id="heading-api-gateway"><strong>API Gateway</strong></h2>
<p>Para descarregar ainda mais funcionalidades básicas para os provedores de nuvem, é uma boa ideia considerar colocar um API Gateway na frente das opções de computação sem servidor mencionadas acima.</p>
<p>Um API Gateway pode ser configurado para lidar com autenticação e autorização. Ele fornece monitoramento pronto para uso e recursos como limitação de taxa e cache, o que pode ajudar a otimizar o desempenho e reduzir custos.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679783356679/f129c09f-a877-4cea-9b8a-63d2a15bb5a4.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-opcoes-de-banco-de-dados-sem-servidor-database-serverless"><strong>Opções de banco de dados sem servidor (database serverless)</strong></h2>
<p>O mercado de banco de dados também está vendo uma mudança igualmente dramática nos últimos anos. Há um número estonteante de opções de banco de dados disponíveis no mercado. O desafio para uma startup é escolher a certa para começar entre as muitas opções viáveis. Escolher um banco de dados é uma tarefa difícil.</p>
<p>Aqui está a nossa orientação. Nosso primeiro conselho é usar um banco de dados relacional. Acreditamos que uma startup deve ir com um banco de dados relacional por várias razões.</p>
<p>Primeiro, os bancos de dados relacionais são uma tecnologia bem estabelecida. Ele oferece grande flexibilidade de esquema que permite que uma startup experimente rapidamente. Há menos atrito para mudar de curso com um banco de dados relacional em comparação com o NoSQL. Com o NoSQL, o esquema de dados é mais rígido. Todos os padrões de acesso a dados devem ser determinados com antecedência para o NoSQL. Isso limita muito a capacidade de uma startup de pivotar.</p>
<p>Em segundo lugar, os bancos de dados relacionais modernos podem ser executados em alta escala. Para a maioria das cargas de trabalho de API, não é incomum que um banco de dados relacional manipule centenas de milhares de usuários ativos.</p>
<p>Em terceiro lugar, quando uma inicialização é tão bem-sucedida que está atingindo o limite de um banco de dados relacional, há um manual bem conhecido para dimensionar a camada de banco de dados, como adicionar camada de cache ou introduzir réplicas de leitura. Consulte a parte 2 desta série para obter mais informações.</p>
<p>Há várias maneiras de operar um banco de dados relacional de produção. Aconselhamos a escolha de uma solução de banco de dados relacional sem servidor. Com um banco de dados sem servidor, o provedor de nuvem assume a maioria das operações do dia-a-dia. Um banco de dados sem servidor desacopla o armazenamento de dados da unidade de computação que executa consultas. As unidades de armazenamento e computação podem aumentar e diminuir a escala independentemente com base na quantidade de tráfego, e o cliente só é cobrado pelos recursos de armazenamento e computação que são realmente usados.</p>
<p><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f269eca-03a3-457f-9227-a9e4e70262b1_1600x1484.png" alt /></p>
<p>Um cuidado é que os bancos de dados sem servidor são relativamente novos. Alguns provedores têm ofertas mais maduras do que outros. Se o seu provedor específico não tiver uma oferta forte, uma solução de banco de dados gerenciado é uma boa alternativa. Com um banco de dados gerenciado, o provedor de nuvem gerencia o hardware do servidor de banco de dados. Eles lidam com a manutenção contínua do hardware subjacente e do próprio software de banco de dados. O cliente é responsável por algumas tarefas operacionais, como gerenciar dimensionamento, backups e ajuste de banco de dados para sua carga de trabalho específica.</p>
<p>Tal como acontece com muitas coisas na engenharia de software, a escolha do primeiro banco de dados é sobre compensações. Existem certas situações em que um banco de dados NoSQL é uma escolha melhor, mas para a maioria das startups onde o ajuste do produto / mercado é incerto, e manter a máxima flexibilidade é inestimável, um banco de dados relacional é provavelmente uma escolha melhor.</p>
<h1 id="heading-pilha-de-inicializacao-moderna"><strong>Pilha de inicialização moderna</strong></h1>
<p>Ao aproveitar uma plataforma de hospedagem front-end de produção, um back-end de API sem servidor e um banco de dados relacional sem servidor, os desenvolvedores hoje em dia começam com uma pilha que os levará longe sem investir muito esforço antecipadamente.</p>
<p>Com essa pilha, eles não estão gerenciando nenhuma infraestrutura ou servidores. Essas ofertas têm alta disponibilidade e redundância de várias zonas incorporadas. Os provedores possuem a responsabilidade de ampliar os serviços à medida que o tráfego cresce.</p>
<p>Esta pilha moderna é poderosa. Ele poderia lidar com muitas dezenas de milhares de usuários, com alguns atingindo centenas de milhares. Está muito longe do que conseguimos alcançar com um único servidor.</p>
<p><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83539392-ff47-4ffb-b969-ba2b37cd5d51_6810x5370.png" alt /></p>
<p>Na parte 4, exploraremos maneiras de escalar essa pilha moderna à medida que o tráfego cresce.</p>
]]></content:encoded></item><item><title><![CDATA[Guia para escalar seu App - parte 2]]></title><description><![CDATA[Artigo em formato áudio:
 
Esse post é o segundo de uma série de 4 posts sobre arquitetura de software
Primeira parte aqui
Leosalesapp 5.0 - Adicionando Cache
Após implementar o padrão de microserviço seu app provavelmente deve ser capaz de suportar ...]]></description><link>https://leonardomoreno.com.br/guia-para-escalar-seu-app-parte-2</link><guid isPermaLink="true">https://leonardomoreno.com.br/guia-para-escalar-seu-app-parte-2</guid><category><![CDATA[Redis]]></category><category><![CDATA[S3]]></category><category><![CDATA[Microserviço]]></category><category><![CDATA[software architecture]]></category><dc:creator><![CDATA[Leonardo Moreno]]></dc:creator><pubDate>Mon, 20 Mar 2023 20:14:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1679260918758/ae895124-e0c1-4c75-a6f8-18381cc35c96.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Artigo em formato áudio:</p>
<div class="hn-embed-widget" id="escalar-app-part-2"></div><p> </p>
<p>Esse post é o segundo de uma série de 4 posts sobre arquitetura de software</p>
<p><a target="_blank" href="https://leonardomoreno.hashnode.dev/guia-para-escalar-seu-app-parte-1">Primeira parte aqui</a></p>
<h2 id="heading-leosalesapp-50-adicionando-cache">Leosalesapp 5.0 - Adicionando Cache</h2>
<p>Após implementar o padrão de microserviço seu app provavelmente deve ser capaz de suportar milhares de acessos dependendo da complexidade do app ele pode ser capaz de atingir até 1 milhão de usuários.</p>
<p>Porém para alguns aplicativos que precisam de muita leitura de dados é preciso otimizar a leitura da base de dados para ser capaz de aguentar picos de tráfego, um evento Black Friday poderia facilmente sobrecarregar o banco de dados, resultando em um apagão da base de dados.</p>
<p>Por isso é importante adicionar uma camada de cache para otimizar as operações de leitura, o mais popular hoje para essa finalidade é o Redis.</p>
<p>O Redis é um banco de dados de memória e adicionaremos os dados mais acessados aliviando o banco de dados relacional ao reduzir o número de operações de leitura executadas no banco de dados convencional, o acesso na memória pode chegar até 1000X mais rápido do que o acesso ao disco.</p>
<p><img src="https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c487af8-7fba-4c04-8c5f-171988e6f95a_1356x694.png" alt /></p>
<p>Para nosso aplicativo de exemplo, implementaremos o cache usando a estratégia de cache de leitura, primeiro os dados serão verificados no Redis se encontrados retornaram imediatamente, caso não sejam encontrados faremos uma consulta no banco de dados e gravados no cache para consulta futura.</p>
<p>Também podemos começar a falar sobre CDN onde ficará todo conteúdo estático do aplicativo (imagens, vídeos, css, js, html e etc).</p>
<p>Uma CDN (Content Delivery Network) serve o conteúdo estático de uma rede de servidores localizados mais perto do usuário final, reduzindo a latência e melhorando a velocidade de carregamento das páginas da Web. Isso resulta em uma melhor experiência do usuário, especialmente para usuários localizados longe do servidor de aplicativos.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679192240590/d8c58ea0-ef89-420d-ad82-6fe04ba45b44.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-leosalesapp-60-escalando-objetos-com-aws-s3">Leosalesapp 6.0 - Escalando objetos com AWS S3</h2>
<p>Alguns aplicativos necessitam de melhor gerenciamento e escalabilidade de objetos como: imagens, vídeos e outros arquivos.</p>
<p>Utilizando o AWS S3 para expandir o servidor de arquivos ganhamos em durabilidade e armazenamento ilimitado e com uma API fácil de armazenar e recuperar arquivos e também pode atuar diretamente como servidor de origem para a CDN.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679196422117/7591180d-acbf-4d5e-8d7b-cd45a0e0f74d.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-leosalesapp-70-microservicos">Leosalesapp 7.0 - Microserviços</h2>
<p>Com o tempo, se o negócio continua crescendo e a empresa continua contratando desenvolvedores, a cama de serviço evolui naturalmente para ser mais granular.</p>
<p>A arquitetura de microsserviços estrutura um aplicativo como uma coleção de serviços pequenos e independentes, com cada serviço executando seus próprios processos e se comunicando entre si por meio de protocolos leves como o gRPC.</p>
<p>Em nosso exemplo, dividimos os serviços em uma camada da Web onde os serviços lidam com solicitações de usuários do cliente.</p>
<p>Os serviços Web encaminham as solicitações para os serviços apropriados na camada de negócios. Aqui temos o serviço ao usuário, o serviço de pedidos e o serviço de inventário como exemplos.</p>
<p>Vale a pena notar que, na arquitetura de microsserviços, os bancos de dados tendem a se tornar específicos do serviço e são gerenciados pelas equipes específicas que possuem esses serviços. Em nosso exemplo, pode haver um cluster de banco de dados de usuário, um cluster de banco de dados de pedidos e um cluster de banco de dados de inventário. Cada um também pode ser fragmentado se as cargas de solicitação exigirem isso.</p>
<p>Em uma arquitetura de microsserviço, também é comum encaminhar solicitações não críticas de latência para filas de mensagens. Isso desacopla a parte crítica de latência do aplicativo daquelas que poderiam ser processadas de forma assíncrona.</p>
<p>Agora temos uma arquitetura de microsserviços completa. No geral, a arquitetura de microsserviços fornece uma maneira de dividir um aplicativo complexo em componentes menores e mais gerenciáveis, levando a uma maior eficiência do desenvolvimento. Isso resolve principalmente um problema organizacional, em vez de um problema técnico.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679259737694/7afdd8da-7f55-4f3d-bd22-b856b6ae8444.png" alt class="image--center mx-auto" /></p>
<p>Termina assim a discussão da segunda parte, até a próxima</p>
]]></content:encoded></item><item><title><![CDATA[Guia para escalar seu App - parte 1]]></title><description><![CDATA[Artigo em formato áudio:
 
Introdução
Em uma série de 4 partes, vamos discutir a evolução de um website/app passando pelos principais tópicos, esse post é uma sugestão para estudo lembrando que não existe uma solução única para o mesmo problema fique...]]></description><link>https://leonardomoreno.com.br/guia-para-escalar-seu-app-parte-1</link><guid isPermaLink="true">https://leonardomoreno.com.br/guia-para-escalar-seu-app-parte-1</guid><category><![CDATA[Microserviço]]></category><category><![CDATA[Monolítico]]></category><category><![CDATA[Arquitetura]]></category><category><![CDATA[Load Balancer]]></category><category><![CDATA[Escala]]></category><dc:creator><![CDATA[Leonardo Moreno]]></dc:creator><pubDate>Wed, 15 Mar 2023 21:33:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1678911088459/27f47a9a-9aff-44b3-b42b-c8d4ed15aeda.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Artigo em formato áudio:</em></p>
<div class="hn-embed-widget" id="audio-post-1"></div><p> </p>
<h2 id="heading-introducao">Introdução</h2>
<p>Em uma série de 4 partes, vamos discutir a evolução de um website/app passando pelos principais tópicos, esse post é uma sugestão para estudo lembrando que não existe uma solução única para o mesmo problema fique livre para dar sua opinião ou propor modificações 🙂</p>
<p><mark>obs: não vamos falar sobre todas as vantagens e desvantagens nessa série.</mark></p>
<h2 id="heading-atualizacao">Atualização</h2>
<p>Decidi exemplificar a teoria utilizando a criação de um sistema do zero vamos desenhar a arquitetura baseado no que estamos falando aqui esse app vai se chamar <strong>Leosalesapp.</strong></p>
<h2 id="heading-arquitetura-monolitica-vs-microservico"><strong>Arquitetura monolítica vs Microserviço</strong></h2>
<p>Vamos começar exemplificando como os sistemas eram criados sem arquitetura distribuída os chamados monolitos e sua evolução para microserviço.</p>
<h3 id="heading-problemas-da-arquitetura-monolitica">Problemas da arquitetura monolítica</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678820240512/881e28cf-6cd0-4b6f-bb39-95cb4f74574a.png" alt class="image--center mx-auto" /></p>
<p>Na figura da arquitetura monolítica possivelmente temos uma API RESTfull para clientes de aplicativos móveis ou web, as imagens e arquivos devem estar no disco local e o banco de dados que também é executado no mesmo servidor.</p>
<p>A arquitetura monolítica provavelmente pode atender a centenas e até milhares de usuários, porém a única maneira de suportar a crescente carga de usuário é aumentar os recursos do servidor como CPU, Memória e etc, e até mesmo o upgrade se tornará recorrente à medida que o servidor chega ao seu limite de capacidade.</p>
<p>Como todo aplicativo executando em um único servidor fica dependendo do uptime exclusivo desse servidor, logo se o servidor cair a aplicação ficará dependente do restart que pode demorar muito tempo tornando a aplicação inacessível em longos períodos.</p>
<h3 id="heading-por-que-evoluir-para-microservico">Por que evoluir para microserviço?</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678820262914/504d7eeb-a29d-456a-8ccb-8112a61406bb.png" alt class="image--center mx-auto" /></p>
<p>Primeiramente não devemos assumir que a arquitetura de microserviço resolve todos os problemas magicamente. Eles são capazes de resolver desafios no crescimento dos softwares das empresas.</p>
<p>Um dos grandes problemas que os microsserviços resolvem são os isolamentos das responsabilidades, contextos e infraestrutura tornando em pequenos sistemas isso facilita quando precisamos escalar um "pedaço" do sistema que é o mais usado e mais importante, logo uma funcionalidade não comprometerá todo o sistema como visto na arquitetura monolítica.</p>
<p><em>Entendemos agora que para ter um sistema escalável devemos seguir com arquitetura baseada em microserviço.</em></p>
<h2 id="heading-leosalesapp-10-monolitico"><strong>Leosalesapp 1.0 - Monolitíco</strong></h2>
<p>O Leosalesapp é um ecommerce para venda de produtos tech.</p>
<p>A primeira versão é uma arquitetura tradicional monolítica bastante usada até os dias de hoje. Tudo no mesmo servidor temos:</p>
<ul>
<li><p>API RESTful para manipular as regras de negócio e fornece-las para o app mobile e Web.</p>
</li>
<li><p>Servidor de aplicativos também disponibiliza conteúdo estático, como imagens que são armazenados diretamente no seu disco local.</p>
</li>
<li><p>E por fim o servidor se conecta ao banco de dados que também é executado no mesmo servidor.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678989562931/51200e03-7cd8-42fc-a805-b8959a979b89.png" alt="Desenho de uma arquitetura monolítica comum" class="image--center mx-auto" /></p>
</li>
</ul>
<p><em>Como mencionado acima a única maneira de escalar é fazendo um upgrade das máquinas, mais CPU, memória etc.</em></p>
<h2 id="heading-leosalesapp-20-mais-servidores">Leosalesapp 2.0 - Mais servidores</h2>
<p>A próxima etapa esperada é colocar o banco de dados e os arquivos em um servidor dedicado a eles.</p>
<p>O banco de dados demanda uma carga de trabalho de servidor diferente ao do servidor de aplicativo, ao separa-lo podemos ajustar ambos de forma independente para suas demandas especificas.</p>
<p>Aproveitamos para desacoplar também o servidor onde contem os arquivos se fizer sentido de acordo com o volume de tráfego.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678994839117/c8928de4-88de-430c-974a-ff56e24e307f.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-leosalesapp-30-load-balancer-e-mais-servidores">Leosalesapp 3.0 - Load balancer e mais servidores</h2>
<p>Com o crescimento do tráfego em algum momento o único servidor de aplicativos ficará sobrecarregado, mesmo podendo redimensionar os servidores a execução da API em um único servidor é ruim do ponto de vista operacional.</p>
<p>Chegou a hora de dimensionar a API horizontalmente introduzindo vários servidores de aplicativos, para fazer isso colocaremos um load balancer entre os aplicativos cliente e os servidores de aplicativos. O balanceador de carga distribuiu as cargas dos clientes em muitos servidores de aplicativos, existe 2 maneiras de distribuir o tráfego, utilizaremos a <strong>Round Robin.</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678997295797/5ca32b50-512c-46d3-806c-42c0828da816.png" alt class="image--center mx-auto" /></p>
<p>Para usar a distribuição round-robin, os dados da sessão do usuário são armazenados no banco de dados. Em cada solicitação, o servidor de aplicativos busca os dados da sessão do usuário do banco de dados antes de processar a solicitação proporcionando maior resiliência no caso de uma falha do servidor, pois ele pode ser substituido facilmente.</p>
<p>Temos outros beneficios como a utilização de TLS que simplifica a implantação de aplicativos seguros.</p>
<p>O balanceador de carga rastreia a integridade de servidores de aplicativos individuais e leva automaticamente cada um para dentro e para fora de serviço com base em sua integridade, tornando a implantação de software sem interrupções do ponto de vista do usuário.</p>
<p>Com um balanceador de carga em vigor, também podemos nos beneficiar de failover e redundância. Se um servidor de aplicativos falhar, o balanceador de carga direcionará automaticamente o tráfego para os servidores íntegros, fornecendo alta disponibilidade e resiliência.</p>
<p>O dimensionamento do servidor de aplicativos traz complexidade extra ao balanceamento de carga. Como podemos ver no resto do artigo, este é um padrão comum: resolvemos um problema introduzindo outro.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679000240539/c8edc7e6-428c-4ce7-9841-1e1f7765c5fa.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-leosalesapp-40-banco-de-dados-de-replica">Leosalesapp 4.0 - Banco de dados de replica</h2>
<p>Conforme contiuamos a crescer os gargalos começarão a aparecer, o banco de dados é provavelmente o primeiro lugar a ter problemas.</p>
<p>O banco de dados por padrão tem problemas para lidar com uma grande número de consultas de leitura enquanto as gravações ocorrem com frequência.</p>
<p>Uma maneira simples de resolver é criando um banco de dados de replica, com esse método implantamos um cluster de banco de dados com um único banco de dados primário para manipular gravações e uma série de réplicas de leitura para manipular leituras, a desvantagem é o atraso na replicação dos dados no banco de dados de leitura.</p>
<p>Para o pequeno número de operações que não podem tolerar atrasos, essas leituras sempre podem ser direcionadas ao banco de dados primário.</p>
<p>Outro problema potencial com bancos de dados relacionais que pode afetar alguns aplicativos é a falta de suporte a pesquisa difusa.</p>
<p>A pesquisa difusa permite a pesquisa, mesmo que haja erros de digitação no termo de pesquisa, o que é útil para aplicativos como o comércio eletrônico on-line, onde permitir que os usuários pesquisem produtos sem exigir o termo de pesquisa correspondente exato é extremamente importante.</p>
<p>Para esses casos de uso específicos, é útil replicar um subconjunto do conjunto de dados em que esses recursos de pesquisa são necessários para um mecanismo de pesquisa de texto completo como o Elasticsearch.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679003310429/afeeb656-57b6-485e-bbf3-3d92bcb983bf.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-proximos-passos">Próximos passos</h2>
<p>Nos posts a seguir vamos falar sobre:</p>
<ul>
<li><p>Quando adicionar cache?</p>
</li>
<li><p>Quando adicionar full-text search engine?</p>
</li>
<li><p>Quando adicionar mensageria?</p>
</li>
<li><p>Quando usar um cluster?</p>
</li>
</ul>
<p>Concluímos assim essa primeira parte 🤖</p>
]]></content:encoded></item></channel></rss>