{"id":2376,"date":"2021-06-22T11:56:52","date_gmt":"2021-06-22T14:56:52","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=2376"},"modified":"2024-01-11T17:59:52","modified_gmt":"2024-01-11T20:59:52","slug":"fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/","title":{"rendered":"Fundamentos para arquitetura de sistemas escal\u00e1veis \/ Cap\u00edtulo 11 v 1.01"},"content":{"rendered":"<p><strong>Para a Google, engenharia de software compreende as pr\u00e1ticas necess\u00e1rias para suportar as mudan\u00e7as de escala, ao longo do tempo, preservando ou melhorando a efici\u00eancia de um sistema.<\/strong> Entretanto, \u00e9 importante reconhecer que as demandas por cuidados com escalabilidade variam significativamente.<\/p>\nEmbora frequentemente mencionada, a escalabilidade nem sempre \u00e9 devidamente tratada nas arquiteturas. A consequ\u00eancia grave disso \u00e9 a incapacidade de atender o crescimento inesperado do <em>workload <\/em>e, quando n\u00e3o h\u00e1 componentes adequados de reten\u00e7\u00e3o,\u00a0instabilidades.\n<hr \/>\n<p>Arquiteturas n\u00e3o planejadas para a escalabilidade &#8211; onde todas as esperan\u00e7as para suportar aumentos s\u00fabitos de demanda ficam depositadas na utiliza\u00e7\u00e3o de\u00a0<i>load balancers\u00a0<\/i>ou na contrata\u00e7\u00e3o de recursos na nuvem &#8211; se convertem rapidamente em custo. Pior que isso, algumas vezes, nem mesmo &#8220;despejar dinheiro&#8221; \u00e9 suficiente.<\/p>\n<h2>Definindo escalabilidade (e elasticidade)<\/h2>\n<p><strong>Escalabilidade \u00e9 a capacidade de sistemas suportarem o aumento (ou a redu\u00e7\u00e3o) dos\u00a0<em>workloads\u00a0<\/em>incrementando (ou reduzindo) o custo em menor ou igual propor\u00e7\u00e3o.<\/strong> As mudan\u00e7as no custo acontecem pelo <em>scale up\/down &#8211;<\/em>\u00a0a\u00a0atualiza\u00e7\u00e3o dos dispositivos computacionais utilizados em termos de mem\u00f3ria, processador, etc &#8211; ou pelo <em>scale out,\u00a0<\/em>modificando a quantidade de dispositivos computacionais.<\/p>\n<p>A diferen\u00e7a principal da escalabilidade para a elasticidade \u00e9 que a segunda acontece de forma r\u00e1pida e din\u00e2mica, incrementando recursos quando o\u00a0<em>workload <\/em>cresce ou decrementando quando diminui. A elasticidade \u00e9 extremamente importante na nuvem, quando o investimento \u00e9 determinado pelo uso.<\/p>\n<h2>A necessidade da escalabilidade<\/h2>\n<p>No passado, sistemas eram desenvolvidos para serem utilizados em contextos bem demarcados. Tanto volume de dados quanto taxas de mudan\u00e7a eram caracter\u00edsticas relativamente f\u00e1ceis de serem previstas. Entretanto, tudo mudou.<\/p>\n<p>Em fun\u00e7\u00e3o da transforma\u00e7\u00e3o digital &#8211; que aproxima empresas de seus clientes, fornecedores e parceiros &#8211; sistemas de software inicialmente desenvolvidos para utiliza\u00e7\u00e3o dentro das empresas, est\u00e3o &#8220;vazando&#8221; para uso externo. Dessa forma, aumentos significativos de\u00a0<em>workloads\u00a0<\/em>acontecem rapidamente e, n\u00e3o raro, de maneira inesperada. Da\u00ed, a necessidade de considerar escalabilidade\u00a0<em>up-front.<\/em><\/p>\n<h2>O impacto da escalabilidade no custo<\/h2>\nMedidas relacionadas com a escalabilidade impactam diretamente em outros atributos de qualidade importantes, destacando disponibilidade, performance e, sobretudo, custo. <strong>Ali\u00e1s, escalabilidade, geralmente, \u00e9 o atributo com maior impacto no custo<\/strong>.\n<hr \/>\n<p>Decis\u00f5es arquiteturais para a escalabilidade t\u00eam impacto consider\u00e1vel sobre os custos de desenvolvimento e\u00a0<em>deploy<\/em>, sobretudo pela inclus\u00e3o de componentes, como mecanismos para orquestra\u00e7\u00e3o e mensageria.<\/p>\n<h2>O impacto da escalabilidade na performance<\/h2>\n<p>Sistemas que demandam, ao mesmo tempo, escalabilidade e performance submetem uma s\u00e9rie de desafios, <em>trade-offs<\/em>, para arquitetos. Afinal, suportar a escala implica no <em>design\u00a0<\/em>de interfaces ass\u00edncronas.<\/p>\n<h2>Estrat\u00e9gias gen\u00e9ricas para a escalabilidade<\/h2>\n<p>Projetar sistemas escal\u00e1veis demanda organiza\u00e7\u00e3o e estrutura. Dentre os m\u00e9todos mais comuns para obter sistemas escal\u00e1veis, destacam-se tr\u00eas estrat\u00e9gias gen\u00e9ricas previstas no &#8220;cubo da escalabilidade&#8221;.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"wp-image-2302 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/116-2.jpg\" alt=\"\" width=\"731\" height=\"385\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/116-2.jpg 1366w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/116-2-300x158.jpg 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/116-2-1024x540.jpg 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/116-2-768x405.jpg 768w\" sizes=\"(max-width: 731px) 100vw, 731px\" \/><\/p>\n<p>O &#8220;cubo da escalabilidade&#8221;, proposto pela consultoria <a href=\"https:\/\/akfpartners.com\">AKF<\/a>, \u00a0\u00e9 um modelo consolidado para segmenta\u00e7\u00e3o de sistemas em servi\u00e7os que cria uma linguagem comum para que equipes discutam op\u00e7\u00f5es relacionadas \u00e0 escalabilidade no projeto de solu\u00e7\u00f5es.<\/p>\n<p>O modelo prescreve tr\u00eas estrat\u00e9gias para escalabilidade:<\/p>\n<ol>\n<li>Escala X &#8211; Escalar na horizontal<\/li>\n<li>Escala Y &#8211; Decomposi\u00e7\u00e3o em servi\u00e7os<\/li>\n<li>Escala Z &#8211; Decomposi\u00e7\u00e3o por\u00a0<em>sharding\u00a0<\/em>ou\u00a0<em>podding<\/em><\/li>\n<\/ol>\n<hr \/>\n<p>As tr\u00eas estrat\u00e9gias podem ser aplicadas de maneira independente ou combinada.<\/p>\n<h4>Escala X &#8211; Escalar na horizontal<\/h4>\n<p>A primeira estrat\u00e9gia prevista no &#8220;cubo da escalabilidade&#8221; consiste em clonar inst\u00e2ncias de aplica\u00e7\u00f5es ou replicar bases de dados, consumidas atrav\u00e9s de um\u00a0<em>load balancer.<\/em><\/p>\n<p>Trata-se de uma abordagem simples, relativamente r\u00e1pida de implementar, que depende da &#8220;elimina\u00e7\u00e3o de recursos compartilhados&#8221;. Aplic\u00e1vel sobretudo quando a taxa de leituras e grava\u00e7\u00f5es seja de 5:1 ou mais.<\/p>\n<h4>Escala Y &#8211; Decomposi\u00e7\u00e3o em servi\u00e7os<\/h4>\n<p>A segunda estrat\u00e9gia prevista no &#8220;cubo da escalabilidade&#8221; consiste em decompor aplica\u00e7\u00f5es em servi\u00e7os e conjuntos de dados independentes, por caracter\u00edsticas funcionais.<\/p>\n<p>Trata-se de uma abordagem significativamente mais complexa e lenta para implementar. Entretanto, tem vantagens de permitir tamb\u00e9m o crescimento da organiza\u00e7\u00e3o (em fun\u00e7\u00e3o da lei de Conway) e isolamento de falhas (melhor resili\u00eancia).<\/p>\n<h4>Escala Z &#8211; Decomposi\u00e7\u00e3o por <em>sharding\u00a0<\/em>ou\u00a0<em>podding<\/em><\/h4>\n<p>A terceira estrat\u00e9gia prevista no &#8220;cubo da escalabilidade&#8221; consistem em decompor aplica\u00e7\u00f5es, segmentando demanda em recursos dedicados. A ideia simples \u00e9 utilizar um mesmo bloco de c\u00f3digo para processar subconjuntos (ou\u00a0<em>shards<\/em>) de dados.<\/p>\n<h2>Isolando &#8220;instabilidades&#8221; com bulkheads<\/h2>\n<p>Quando se trata de suportar escala, n\u00e3o h\u00e1 solu\u00e7\u00f5es \u201cbala de prata\u201d. De maneira simpl\u00f3ria, \u00e9 f\u00e1cil assumir que ter uma arquitetura que \u201cescala horizontalmente\u201d, rodando em uma infraestrutura poderosa (como a nuvem), \u00e9 suficiente para impedir \u201cquedas\u201d de sistemas. Infelizmente, esse n\u00e3o \u00e9 o caso!<\/p>\n<p>Considere um sistema com tr\u00eas componentes: \u201cA\u201d, \u201cB\u201d e \u201cC\u201d. Onde \u201cA\u201d e \u201cB\u201d dependem sincronamente de \u201cC\u201d para funcionar.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-2325 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/a.png\" alt=\"\" width=\"250\" height=\"230\" \/><\/p>\n<p>Caso \u201cC\u201d fique inst\u00e1vel, \u201cA\u201d e \u201cB\u201d podem ter dificuldades para continuar funcionando bem, o que pode espalhar falhas em \u201cefeito domin\u00f3\u201d. Ou seja, a instabilidade de \u201cC\u201d pode acabar gerando instabilidades em \u201cA\u201d e \u201cB\u201d que, eventualmente, ir\u00e3o causar instabilidades em outros componentes.<\/p>\n<hr \/>\n<strong>A maioria dos projetos de sistemas onde h\u00e1 depend\u00eancia forte entre componentes tem alguma conting\u00eancia para falhas mais graves.<\/strong> No exemplo, provavelmente \u201cA\u201d e \u201cB\u201d est\u00e3o preparados para cen\u00e1rios onde \u201cC\u201d simplesmente pare de responder. <strong>Entretanto, poucas vezes encontramos arquiteturas preparadas para lidar com <em>response times <\/em>mais altos.<\/strong> Geralmente, lentid\u00e3o, mais do que indisponibilidade total, \u00e9 a causa raiz da maioria dos problemas mais cr\u00edticos em produ\u00e7\u00e3o.\n<hr \/>\n<p>Uma forma comum de tentar mitigar os impactos de instabilidades em um componente \u00e9 torn\u00e1-lo escal\u00e1vel na horizontal para, ent\u00e3o, levantar v\u00e1rias inst\u00e2ncias com demanda distribu\u00edda por um <em>load balancer.<\/em><\/p>\n<div class=\"wp-block-image\">\n<p><img decoding=\"async\" class=\"size-full wp-image-2326 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/b.png\" alt=\"\" width=\"289\" height=\"292\" \/><\/p>\n<p>O problema, entretanto, \u00e9 que, com frequ\u00eancia, instabilidades, sobretudo de lentid\u00e3o, s\u00e3o ocasionadas por dificuldades de um componente para atender \u201crequisi\u00e7\u00f5es envenenadas\u201d provenientes de um \u201cofensor externo\u201d. Em nosso exemplo, caso \u201cA\u201d gere \u201crequisi\u00e7\u00f5es envenenadas\u201d para \u201cC\u201d, estas podem acabar afetando todas as inst\u00e2ncias do servi\u00e7o, mesmo escalados na horizontal, apenas retardando os efeitos ruins, sem evit\u00e1-los.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2327 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/c.png\" alt=\"\" width=\"289\" height=\"316\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/c.png 289w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/c-274x300.png 274w\" sizes=\"(max-width: 289px) 100vw, 289px\" \/><\/p>\n<\/div>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\">Uma alternativa eficiente para mitigar o risco dessa situa\u00e7\u00e3o \u00e9 compartimentar inst\u00e2ncias para as diversas origens de requisi\u00e7\u00e3o. Ou seja, \u201clevantar\u201d inst\u00e2ncias espec\u00edficas para cada natureza de solicita\u00e7\u00e3o, mantendo-as apartadas.<\/figure>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2328 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/d.png\" alt=\"\" width=\"289\" height=\"292\" \/><\/p>\n<\/div>\n<div class=\"wp-block-image\">\n<p>Dessa forma, a \u201cpress\u00e3o\u201d de \u201cA\u201d sobre \u201cC\u201d n\u00e3o impactar\u00e1 \u201cB\u201d. Nesse mesmo racioc\u00ednio, a \u201cpress\u00e3o\u201d de \u201cB\u201d sobre \u201cC\u201d tamb\u00e9m n\u00e3o causar\u00e1 problemas para \u201cA\u201d.<\/p>\n<\/div>\nNo \u201cmundo real\u201d, j\u00e1 vimos essa solu\u00e7\u00e3o ser aplicada, por exemplo, em grandes varejistas para apartar o tratamento de requisi\u00e7\u00f5es de aplica\u00e7\u00f5es m\u00f3veis, <em>site, <\/em>rob\u00f4s de compara\u00e7\u00e3o de pre\u00e7os e o Google (como voc\u00ea pode imaginar, para um varejista, \u00e9 tremendamente prejudicial ser \u201cpenalizado\u201d pelo gigante das buscas).\n<hr \/>\n<p>O nome dessa t\u00e9cnica de <em>design<\/em> \u00e9 <em>bulkhead, <\/em>em alus\u00e3o a forma como navios eram projetados para impedir que danos em uma parte do cascos causassem um naufr\u00e1gio.<\/p>\n<em>Bulkheads <\/em>obviamente, introduzem ociosidade desnecess\u00e1ria (leia-se desperd\u00edcio) de recursos a uma arquitetura, tornando-a economicamente menos interessante. Entretanto, essa inefici\u00eancia pode ser necess\u00e1ria e, geralmente, \u00e9 mais do que compensada com a minimiza\u00e7\u00e3o e isolamento de <em>downtimes. <\/em>Um de seus principais atrativos \u00e9 que pode ser adotada, frequentemente, com poucas altera\u00e7\u00f5es (ou at\u00e9 nenhuma) de c\u00f3digo.\n<hr \/>\n<h2>Caching<\/h2>\n<p>Cache \u00e9 uma forma de armazenamento de dados intermedi\u00e1rio (hardware ou software) que pode servir seus dados mais r\u00e1pido do que a fonte de dados original (banco de dados, servi\u00e7o da web, etc.).<\/p>\n<p>O armazenamento em cache \u00e9 essencial porque pode melhorar o desempenho do aplicativo significativamente, economizando o tempo dos usu\u00e1rios e o dinheiro da empresa. Entretanto, com certeza, introduz uma nova categoria de complexidades arquitet\u00f4nicas e de implementa\u00e7\u00e3o (onde complexidade significa custo). Mas, se um aplicativo depende muito de rede, disco e outros recursos lentos, uma estrat\u00e9gia de cache adequada pode salvar o dia.<\/p>\n<h4><span id=\"When_caching_is_important\">Quando\u00a0cache pode ajudar<\/span><\/h4>\n<p>A ado\u00e7\u00e3o de <em>caching\u00a0<\/em>pode ajudar consideravelmente a melhorar a performance e a escalabilidade de um sistema de software quando \u00e9 necess\u00e1rio:<\/p>\n<ul>\n<li>acessar recursos hospedados externamente (em outro contexto de hospedagem);<\/li>\n<li>recuperar recursos que\u00a0<strong>n\u00e3o<\/strong>\u00a0mudam com frequ\u00eancia;<\/li>\n<li>recuperar representa\u00e7\u00f5es dos mesmos recursos continuamente;<\/li>\n<li>produzir a mesma sa\u00edda para demandas de computa\u00e7\u00e3o frequentemente;<\/li>\n<li>executar c\u00e1lculos de agrega\u00e7\u00e3o extensos m\u00faltiplas vezes.<\/li>\n<\/ul>\n<hr \/>\n<h4><span id=\"Where_the_cache_should_run\">Onde implementar <em>caching<\/em><\/span><\/h4>\n<p>Para aplicativos cliente-servidor, um cache pode ser:<\/p>\n<ul>\n<li><strong>do lado do cliente<\/strong>\u00a0, implementado no cliente (por exemplo, o navegador)<\/li>\n<li><strong>lado do servidor,<\/strong>\u00a0implementado no servidor<\/li>\n<li><strong>em algum lugar no meio (CDN)<\/strong><\/li>\n<\/ul>\n<hr \/>\n<p>Em cen\u00e1rios distribu\u00eddos, o cache pode ser:<\/p>\n<ul>\n<li><strong>local<\/strong>\u00a0, na mesma m\u00e1quina (n\u00f3) onde o aplicativo est\u00e1 rodando<\/li>\n<li><strong>remoto<\/strong>\u00a0, em outro computador, acess\u00edvel atrav\u00e9s da infraestrutura de rede.<\/li>\n<\/ul>\n<hr \/>\n<p>Finalmente, sempre que o cache \u00e9 implementado localmente, pode ser:<\/p>\n<ul>\n<li><strong>em processo<\/strong>\u00a0, executando no mesmo processo do sistema operacional do aplicativo de consumo (na mem\u00f3ria)<\/li>\n<li><strong>fora do processo<\/strong>\u00a0, em execu\u00e7\u00e3o em outro processo do sistema operacional.<\/li>\n<\/ul>\n<hr \/>\n<p>Existem pr\u00f3s e contras para cada um desses tipos.\u00a0A op\u00e7\u00e3o certa depende do contexto.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Cuidado com o GC!<\/p>\r\n<\/p>\n<p>C\u00f3digo, tanto em .NET quanto em Java, \u00e9 dito gerenciado. Isso significa que programadores t\u00eam a liberdade de programar sem codificar a &#8220;desaloca\u00e7\u00e3o&#8221; de mem\u00f3ria. Isso, entretanto, n\u00e3o significa que n\u00e3o seja necess\u00e1rio se preocupar com isso.<\/p>\n<p>De forma simplificada, de tempos em tempos o\u00a0<em>runtime\u00a0<\/em>interrompe a execu\u00e7\u00e3o do sistema para &#8220;coletar&#8221; objetos que n\u00e3o estejam mais referenciados. A frequ\u00eancia e a dura\u00e7\u00e3o das interrup\u00e7\u00f5es est\u00e1 relacionada com a &#8220;voracidade&#8221; do sistema para criar objetos que possam ser descartados. Objetos que &#8220;sobrevivem&#8221; a coletas acabam, pelas heur\u00edsticas dos coletores, permanecem mais tempo na mem\u00f3ria, podendo gerar press\u00e3o sobre os sistemas.<\/p>\n<p>Objetos em cache local, no processo, podem causar &#8220;confus\u00e3o&#8221; ao funcionamento do GC. Por isso, esta abordagem precisa ser criteriosa.<\/p>\n<p><\/div>\n<h4><span id=\"Cache_writing_strategies\">Estrat\u00e9gias gen\u00e9ricas para &#8220;hidratar&#8221; o cache<\/span><\/h4>\n<p>Existem duas estrat\u00e9gias comuns para gravar dados em um cache:<\/p>\n<ol>\n<li><strong>Pr\u00e9-caching de dados<\/strong>, para pequenos peda\u00e7os de dados, geralmente durante a inicializa\u00e7\u00e3o do aplicativo, antes de qualquer solicita\u00e7\u00e3o.<\/li>\n<li><strong>Sob demanda<\/strong>, verificando primeiro se os dados solicitados est\u00e3o no cache (se os dados forem encontrados, \u00e9 chamado de\u00a0<em>acerto de cache<\/em>), utilizando-os, melhorando o desempenho da aplica\u00e7\u00e3o.\u00a0Sempre que os dados solicitados n\u00e3o forem gravados no cache (<em>perda de cache<\/em>), o aplicativo precisar\u00e1 recuper\u00e1-los da fonte mais lenta e, em seguida, gravar os resultados no cache, economizando tempo nas solicita\u00e7\u00f5es subsequentes dos mesmos dados.<\/li>\n<\/ol>\n<hr \/>\n<h4><span id=\"Cache_replacement_strategies\">Estrat\u00e9gias de substitui\u00e7\u00e3o de cache<\/span><\/h4>\n<p>Freq\u00fcentemente, o cache tem um tamanho fixo limitado.\u00a0Portanto, sempre que voc\u00ea precisar gravar no cache (normalmente, ap\u00f3s uma falha no cache), \u00e9 preciso determinar se os dados recuperados da fonte mais lenta devem ou n\u00e3o ser gravados no cache e se o limite de tamanho foi atingido e, nesse caso, quais dados precisariam ser removidos dele.<\/p>\n<p>Infelizmente, n\u00e3o existe uma solu\u00e7\u00e3o global.\u00a0Algumas vezes, a melhor estrat\u00e9gia seria remover do cache os dados menos solicitados recentemente.\u00a0Mas, h\u00e1 situa\u00e7\u00f5es em que ser\u00e1 necess\u00e1rio levar em considera\u00e7\u00e3o outros aspectos, como, por exemplo, o custo de recuperar os dados da fonte mais lenta.<\/p>\n<p>Qualquer estrat\u00e9gia de substitui\u00e7\u00e3o de cache ter\u00e1 suas desvantagens e ser\u00e1 necess\u00e1rio considerar o contexto de cada aplicativa aplicativo.\u00a0<strong>A melhor abordagem ser\u00e1 aquela que resulta em menos <em>hit fails<\/em><\/strong>.<\/p>\n<h4><span id=\"Cache_invalidation_strategies\">Estrat\u00e9gias de invalida\u00e7\u00e3o de cache<\/span><\/h4>\n<p>A invalida\u00e7\u00e3o do cache \u00e9 o processo de determinar se um dado no cache deve ou n\u00e3o ser usado para atender a solicita\u00e7\u00f5es subsequentes.<\/p>\n<blockquote><p>Existem apenas duas coisas dif\u00edceis na Ci\u00eancia da Computa\u00e7\u00e3o: invalida\u00e7\u00e3o de cache e nomes de coisas.\u00a0(Phil Karlton)<\/p><\/blockquote>\n<p>Visto que o aplicativo raramente deve servir dados obsoletos ou inv\u00e1lidos aos usu\u00e1rios, devemos sempre projetar algum mecanismo para invalidar os dados armazenados em cache.<\/p>\n<p>As estrat\u00e9gias mais comuns para invalida\u00e7\u00e3o de cache s\u00e3o:<\/p>\n<ul>\n<li><strong>Tempo de expira\u00e7\u00e3o<\/strong>\u00a0, onde o aplicativo sabe por quanto tempo os dados ser\u00e3o v\u00e1lidos.\u00a0Ap\u00f3s este tempo, os dados devem ser removidos do cache causando uma \u201cperda de cache\u201d em uma solicita\u00e7\u00e3o subsequente;<\/li>\n<li><strong>Verifica\u00e7\u00e3o de atualiza\u00e7\u00e3o em cache<\/strong>\u00a0, em que o aplicativo executa um procedimento leve para determinar se os dados ainda s\u00e3o v\u00e1lidos sempre que s\u00e3o recuperados.\u00a0A desvantagem dessa alternativa \u00e9 que ela produz algum overhead de execu\u00e7\u00e3o;<\/li>\n<li><strong>Invalida\u00e7\u00e3o ativa<\/strong>\u00a0, em que o aplicativo invalida ativamente os dados no cache, normalmente quando alguma mudan\u00e7a de estado \u00e9 identificada.<\/li>\n<\/ul>\n<hr \/>\n<h2>Ass\u00edncrono sempre que poss\u00edvel<\/h2>\nDe maneira geral, chamadas ass\u00edncronas, seja entre m\u00e9todos ou entre servi\u00e7os, s\u00e3o muito mais complexas de implementar e manter do que chamadas s\u00edncronas. Afinal, chamadas ass\u00edncronas exigem a ado\u00e7\u00e3o de algum modelo de coordena\u00e7\u00e3o (como <em>callbacks<\/em>).\n<p>A &#8220;dificuldade&#8221; para manter sistemas ass\u00edncronos, os modelos de coordena\u00e7\u00e3o, tamb\u00e9m representam sua principal for\u00e7a. Quando utilizadas entre servi\u00e7os, chamadas ass\u00edncronas frequentemente utilizam alguma estrat\u00e9gia de resili\u00eancia que, por sua vez, coopera para a disponibilidade. Al\u00e9m disso, desconecta a\u00a0<span style=\"text-decoration: underline;\">taxa de demanda<\/span> da\u00a0<span style=\"text-decoration: underline;\">taxa de atendimento.<\/span><\/p>\n<h2>Indica\u00e7\u00f5es e contraindica\u00e7\u00f5es<\/h2>\n<p>Escalabilidade \u00e9 um atributo desej\u00e1vel mas que sempre representa incremento na complexidade e, eventualmente, no custo. Por isso, \u00e9 importante ter clareza sobre a prioridade deste atributo frente aos demais.<\/p>\n<p>A experi\u00eancia ensina que a primeira medida para suportar a escala \u00e9\u00a0<em>caching\u00a0<\/em>agressivo e a ado\u00e7\u00e3o de modelos ass\u00edncronos de comunica\u00e7\u00e3o. Depois, a solu\u00e7\u00e3o mais pragm\u00e1tica \u00e9 preparar os sistemas para o <em>scale out<\/em>. Eventualmente, pode ser necess\u00e1rio particionar o sistema por dados. Finalmente, depois de tudo isso, particionar o sistema por funcionalidades (servi\u00e7os).<\/p>\n<h2><span id=\"TODO\">\/\/ TODO<\/span><\/h2>\n<p>Antes de avan\u00e7ar para o pr\u00f3ximo cap\u00edtulo, recomendo as seguintes reflex\u00f5es:<\/p>\n<ol>\n<li>Os sistemas em que voc\u00ea trabalha tem &#8220;suporte&#8221; para escalabilidade?<\/li>\n<li>Quais das estrat\u00e9gias gen\u00e9ricas para escalabilidade est\u00e1 mais habituado a adotar?<\/li>\n<li>Qual relev\u00e2ncia de\u00a0<em>caching\u00a0<\/em>para sua aplica\u00e7\u00e3o?<\/li>\n<\/ol>\n","protected":false},"featured_media":2313,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[],"sessoes":[58],"apendices":[],"capitulos":[38],"class_list":["post-2376","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","sessoes-secao-2","capitulos-capitulo-2-2"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Fundamentos para arquitetura de sistemas escal\u00e1veis \/ Cap\u00edtulo 11 v 1.01 - Manual do Arquiteto de Software<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fundamentos para arquitetura de sistemas escal\u00e1veis \/ Cap\u00edtulo 11 v 1.01 - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Para a Google, engenharia de software compreende as pr\u00e1ticas necess\u00e1rias para suportar as mudan\u00e7as de escala, ao longo do tempo, preservando ou melhorando a efici\u00eancia de um sistema. Entretanto, \u00e9 importante reconhecer que as demandas por cuidados com escalabilidade variam significativamente. Arquiteturas n\u00e3o planejadas para a escalabilidade &#8211; onde todas as esperan\u00e7as para suportar aumentos [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/\" \/>\n<meta property=\"og:site_name\" content=\"Manual do Arquiteto de Software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/eximiaco\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-11T20:59:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/edward-howell-VlTJdP8ZY1c-unsplash.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"666\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@eximiaco\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/\",\"name\":\"Fundamentos para arquitetura de sistemas escal\u00e1veis \/ Cap\u00edtulo 11 v 1.01 - Manual do Arquiteto de Software\",\"isPartOf\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/edward-howell-VlTJdP8ZY1c-unsplash.jpg\",\"datePublished\":\"2021-06-22T14:56:52+00:00\",\"dateModified\":\"2024-01-11T20:59:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/edward-howell-VlTJdP8ZY1c-unsplash.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/edward-howell-VlTJdP8ZY1c-unsplash.jpg\",\"width\":1024,\"height\":666},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Volume 1\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Fundamentos para arquitetura de sistemas escal\u00e1veis \/ Cap\u00edtulo 11 v 1.01\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"name\":\"Manual do Arquiteto de Software\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\",\"name\":\"EximiaCo\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"width\":150,\"height\":150,\"caption\":\"EximiaCo\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/eximiaco\",\"https:\/\/x.com\/eximiaco\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fundamentos para arquitetura de sistemas escal\u00e1veis \/ Cap\u00edtulo 11 v 1.01 - Manual do Arquiteto de Software","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/","og_locale":"pt_BR","og_type":"article","og_title":"Fundamentos para arquitetura de sistemas escal\u00e1veis \/ Cap\u00edtulo 11 v 1.01 - Manual do Arquiteto de Software","og_description":"Para a Google, engenharia de software compreende as pr\u00e1ticas necess\u00e1rias para suportar as mudan\u00e7as de escala, ao longo do tempo, preservando ou melhorando a efici\u00eancia de um sistema. Entretanto, \u00e9 importante reconhecer que as demandas por cuidados com escalabilidade variam significativamente. Arquiteturas n\u00e3o planejadas para a escalabilidade &#8211; onde todas as esperan\u00e7as para suportar aumentos [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-11T20:59:52+00:00","og_image":[{"width":1024,"height":666,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/edward-howell-VlTJdP8ZY1c-unsplash.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/","name":"Fundamentos para arquitetura de sistemas escal\u00e1veis \/ Cap\u00edtulo 11 v 1.01 - Manual do Arquiteto de Software","isPartOf":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website"},"primaryImageOfPage":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/edward-howell-VlTJdP8ZY1c-unsplash.jpg","datePublished":"2021-06-22T14:56:52+00:00","dateModified":"2024-01-11T20:59:52+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/edward-howell-VlTJdP8ZY1c-unsplash.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/edward-howell-VlTJdP8ZY1c-unsplash.jpg","width":1024,"height":666},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-escalaveis-capitulo-11-v-1-012\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/"},{"@type":"ListItem","position":2,"name":"Volume 1","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/"},{"@type":"ListItem","position":3,"name":"Fundamentos para arquitetura de sistemas escal\u00e1veis \/ Cap\u00edtulo 11 v 1.01"}]},{"@type":"WebSite","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","name":"Manual do Arquiteto de Software","description":"","publisher":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization","name":"EximiaCo","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","width":150,"height":150,"caption":"EximiaCo"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/eximiaco","https:\/\/x.com\/eximiaco"]}]}},"_links":{"self":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1\/2376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1"}],"about":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/types\/volume-1"}],"replies":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/comments?post=2376"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/2313"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=2376"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=2376"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=2376"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=2376"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=2376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}