{"id":2561,"date":"2021-07-01T09:43:35","date_gmt":"2021-07-01T12:43:35","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=2561"},"modified":"2024-01-11T17:59:08","modified_gmt":"2024-01-11T20:59:08","slug":"fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/","title":{"rendered":"Fundamentos para arquitetura de sistemas com boa performance \/ Cap\u00edtulo 12 v 1.03"},"content":{"rendered":"<strong>Performance sempre ser\u00e1 um atributo de qualidade importante, em qualquer arquitetura.<\/strong> Sistemas sem performance satisfat\u00f3ria t\u00eam <em>usability, avialability\u00a0<\/em>e s<i>calability <\/i>comprometidos.\u00a0Em \u00faltima inst\u00e2ncia, sistemas que n\u00e3o atendem expectativas m\u00ednimas de boa performance falham em cumprir os objetivos do neg\u00f3cio.\n<hr \/>\n<p>Pela relev\u00e2ncia, as expectativas m\u00ednimas de boa performance devem ser determinadas o mais cedo poss\u00edvel. Depois disso, devem ser consideradas na avalia\u00e7\u00e3o das proposi\u00e7\u00f5es de <em>design <\/em>arquiteturais\u00a0candidatas.<\/p>\n<strong>Inicialmente, as expectativas de performance podem ser expressas pelos tempos percebidos pelos usu\u00e1rios na utiliza\u00e7\u00e3o de\u00a0<em>features\u00a0<\/em>chave.<\/strong> Entretanto, na medida em que decis\u00f5es de <em>design\u00a0<\/em>s\u00e3o realizadas, devem ser especializadas para cada componente.\n<hr \/>\n<strong>\u00c9 importante, entretanto, n\u00e3o ignorar que iniciativas para melhorar a performance geralmente adicionam complexidade e podem prejudicar o <em>evolvability.\u00a0<\/em><\/strong>Performance \u00e9 fundamental, mas, se perseguida cegamente pode atingir n\u00edveis desnecess\u00e1rios que s\u00f3 corroem a manutenabilidade, incrementando os custos.\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\" wp-image-2519 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/tradeoffs.png\" alt=\"\" width=\"465\" height=\"446\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/tradeoffs.png 1033w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/tradeoffs-300x288.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/tradeoffs-1024x982.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/tradeoffs-768x737.png 768w\" sizes=\"(max-width: 465px) 100vw, 465px\" \/><\/p>\n<p>&nbsp;<\/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;\">Usabilidade define performance<\/p>\r\n<\/p>\n<p><strong>Performance \u00e9 determinante para melhorar a usabilidade. Entretanto, distante do \u00f3bvio, algumas vezes o segredo n\u00e3o \u00e9 &#8220;aumentar a velocidade&#8221;, mas diminuir.<\/strong><\/p>\n<p><a href=\"https:\/\/www.linkedin.com\/in\/wsantosdev\/\">William Santos<\/a>, integrante da primeira turma de mentoria em arquitetura de software compartilha um cen\u00e1rio curioso, relacionado a sistemas de <em>Home Broker<\/em>. Segundo ele destaca, frequentemente as cota\u00e7\u00f5es de renda vari\u00e1vel s\u00e3o atualizadas em intervalos menores aos que o olho humano \u00e9 capaz de captar. Nestes casos, performance n\u00e3o necessariamente \u00e9 positiva. Para tornar as atualiza\u00e7\u00f5es percept\u00edveis, em um dos sistemas em que esteve envolvido, foi estabelecido um intervalo m\u00ednimo para propag\u00e1-las, de modo a descartar o envio da cota\u00e7\u00f5es que seriam impercept\u00edveis. Desta forma, apenas atualiza\u00e7\u00f5es percept\u00edveis passaram a ser transmitidas, o que aumentou o conforto do cliente, levando-o a ter mais clareza sobre as mudan\u00e7as e podendo tomar decis\u00f5es mais bem pensadas \u2013 ao mesmo tempo em que reduziu o consumo de recursos para a transmiss\u00e3o de cota\u00e7\u00f5es.<\/p>\n<p><\/div>\n<h2>Definindo performance<\/h2>\n<p><strong>De maneira superficial, performance, como atributo de qualidade, trata do tempo que um sistema necessita para completar uma determinada categoria de atividades.\u00a0<\/strong>De forma mais precisa, entretanto, a performance tamb\u00e9m tem rela\u00e7\u00e3o direta com a capacidade para suportar <em>workloads<\/em> &#8211; com tamanhos diversos em intervalos com m\u00ednimos e m\u00e1ximos bem-definidos &#8211; e restri\u00e7\u00f5es de recursos computacionais.<\/p>\nUm sistema tem performance &#8220;<em>good enough<\/em>&#8221; quando atende as expectativas relativas aos tempos para executar processamentos, sob uma determinada carga, sem saturar os recursos computacionais dispon\u00edveis. <strong>Tudo isso, otimizando a fun\u00e7\u00e3o de avalia\u00e7\u00e3o da arquitetura, geralmente o custo.<\/strong>\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;\">Quando o 'neg\u00f3cio' n\u00e3o sugere performance<\/p>\r\n<\/p>\n<p>O ideal \u00e9 sempre alinhar expectativas de performance antes de fazer qualquer decis\u00e3o de <em>design<\/em>. Entretanto, com frequ\u00eancia, as expectativas do neg\u00f3cio s\u00e3o inexistentes ou vagas.<\/p>\n<p>Tem pouca utilidade, por exemplo, determinar que o <em>response time\u00a0<\/em>de um determinado\u00a0<em>endpoint\u00a0<\/em>deve ser abaixo de <em>300 ms\u00a0<\/em>se n\u00e3o se conseguir estimar um\u00a0<em>workload\u00a0<\/em>associado.<\/p>\n<p>Quando sistemas s\u00e3o elaborados sem essa &#8220;expectativa&#8221; clarificada, \u00e9 \u00fatil realizar testes de estresse afim de determinar a realidade atual e validar se esta \u00e9 suficiente. Eventualmente, essa abordagem, entretanto, pode revelar &#8220;tempo perdido&#8221; com uma solu\u00e7\u00f5es que &#8220;ficam devendo&#8221;, ou desperd\u00edcio com solu\u00e7\u00f5es que &#8220;sobram demais&#8221;.<\/p>\n<p><\/div>\n<h2>Rela\u00e7\u00e3o com o custo<\/h2>\nA boa arquitetura de software atende os objetivos do neg\u00f3cio, respeitando restri\u00e7\u00f5es e atingindo par\u00e2metros expressos nos atributos de qualidade. Para isso, <strong>trata do <em>design\u00a0<\/em>dos componentes, suas responsabilidades e relacionamentos, tudo isso, de acordo com uma fun\u00e7\u00e3o objetivo, geralmente o custo.<\/strong>\n<hr \/>\n<p>Melhorar a performance sempre impacta o custo, por isso, \u00e9 importante determinar que abordagem utilizar. As vezes, melhorar a infraestrutura custa menos do que melhorar o c\u00f3digo. Outras vezes, melhorar o c\u00f3digo compensa a economia em infraestrutura. \u00c9 importante ter sensibilidade.<\/p>\n<h2>Aspectos determinantes para a performance<\/h2>\n<p>H\u00e1 quatro aspectos determinantes para a performance de um sistema de software e que, por isso, s\u00e3o preocupa\u00e7\u00f5es arquiteturais: tamanho do <em>workload, <\/em>restri\u00e7\u00f5es para recursos computacionais, estrat\u00e9gias de enfileiramento e qualidade interna de implementa\u00e7\u00e3o dos componentes.<\/p>\n<p><img decoding=\"async\" class=\"wp-image-2517 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/performance.png\" alt=\"\" width=\"583\" height=\"424\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/performance.png 1297w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/performance-300x218.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/performance-1024x745.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/performance-768x558.png 768w\" sizes=\"(max-width: 583px) 100vw, 583px\" \/><\/p>\n<h4>Tamanho do <em>workload<\/em><\/h4>\n<p><strong>\u00c9 fundamental, para o <em>design<\/em> de sistemas com boa performance, conhecer qual ser\u00e1 o tamanho do <em>workload<\/em>\u00a0que dever\u00e1 ser suportado. <\/strong>Geralmente, \u00e9 \u00fatil (e at\u00e9 mais f\u00e1cil) realizar tr\u00eas tipos de previs\u00f5es: pessimista, otimista e realista.<\/p>\nPor exemplo, para sistemas Web interativos \u00e9 interessante saber a quantidade usu\u00e1rios simult\u00e2neos, o padr\u00e3o de comportamento desses usu\u00e1rios, o volume de dados ser\u00e1 manipulado (tanto em comandos quanto em consultas), etc.\n<hr \/>\n<p>\u00c9 a partir da previs\u00e3o do <em>workload\u00a0<\/em>que \u00e9 poss\u00edvel determinar se o dimensionamento da infraestrutura \u00e9 suficiente.<\/p>\n<h4>Restri\u00e7\u00f5es para recursos computacionais<\/h4>\n<p>O conhecimento das capacidades de processamento e caracter\u00edsticas de performance das tecnologias autorizadas \u00e9 determinante, no\u00a0<em>design<\/em> arquitetural, para decis\u00f5es relacionadas a organiza\u00e7\u00e3o e estrutura dos componentes.<\/p>\n<p>As capacidades de resposta das tecnologias permitem antecipar qual ser\u00e1 a realidade da performance, inclusive, estrat\u00e9gias para mitigar riscos de satura\u00e7\u00e3o.<\/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;\">Hardware faz diferen\u00e7a!<\/p>\r\n<\/p>\n<p>Certa vez, o time de desenvolvimento de um cliente comprometeu semanas de trabalho &#8220;otimizando&#8221; uma <em>feature <\/em>complexa que fazia uso intensivo de leituras e escritas em dispositivo persistente. Alguns testes apontavam ganhos de performance de 2000%! Entretanto, os ganhos n\u00e3o foram percebidos no ambiente produtivo.<\/p>\n<p>No ambiente de desenvolvimento e testes o dispositivo persistente era um HDD. Em ambiente produtivo, era um SSD&#8230;<\/p>\n<p><\/div>\n<h4>Estrat\u00e9gias de enfileiramento<\/h4>\n<p>Invariavelmente, em qualquer sistema, recursos computacionais poder\u00e3o n\u00e3o estar dispon\u00edveis sempre que uma demada ocorrer &#8211; seja por n\u00e3o estarem em estado de prontid\u00e3o ou por conten\u00e7\u00e3o em outra atividade. Sempre que isso acontece, h\u00e1 espera (<em>wait time<\/em>).<\/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;\"><em>.NET Socket Starvation<\/em><\/p>\r\n<\/p>\n<p>.NET tem uma falha conhecida de design na classe <em>HttpClient<\/em>. Por <a href=\"https:\/\/docs.microsoft.com\/pt-br\/aspnet\/web-api\/overview\/advanced\/calling-a-web-api-from-a-net-client#create-and-initialize-httpclient\">algumas raz\u00f5es<\/a>, <em>HttpClient<\/em> n\u00e3o libera os <em>sockets<\/em> que utiliza quando o m\u00e9todo <em>Dispose <\/em>\u00e9 invocado, o que pode fazer com que a aplica\u00e7\u00e3o sofra com <em>Socket Starvation<\/em> ao criarmos muitas inst\u00e2ncias. Eventualmente, isso causa &#8220;enfileiramento&#8221; de processamentos que precisam de novos <em>sockets\u00a0<\/em>causando redu\u00e7\u00e3o de\u00a0<em>throughput<\/em> e, eventualmente, afetando outros recursos, como mem\u00f3ria e CPU.<\/p>\n<div class=\"wpd-comment-text\">\n<p><\/div>\n<\/div>\n<h4>Qualidade interna de implementa\u00e7\u00e3o dos componentes<\/h4>\n<p><strong>De pouco adianta haverem bons recursos computacionais se o c\u00f3digo n\u00e3o fazer o uso correto destes recursos.<\/strong> Processadores com m\u00faltiplos <em>core\u00a0<\/em>e sistemas <em>single-thread.\u00a0<\/em>Mem\u00f3ria de sobra e processadores potentes, mas interrup\u00e7\u00f5es frequentes de execu\u00e7\u00e3o para coletas de lixo evit\u00e1veis. Etc.<\/p>\n<h2>Pareto e a performance<\/h2>\nEmpiricamente, \u00e9 f\u00e1cil observar que 20% das funcionalidades de um sistema s\u00e3o utilizadas 80% do tempo &#8211; trata-se da aplica\u00e7\u00e3o da propor\u00e7\u00e3o\/princ\u00edpio de Pareto. Geralmente, as exig\u00eancias de performance ser\u00e3o maiores para essas funcionalidades.\n<hr \/>\n<p><strong>Tamb\u00e9m \u00e9 comum observar que 80% dos recursos computacionais de um sistema s\u00e3o consumidos por 20% do c\u00f3digo.<\/strong> H\u00e1 uma vis\u00e3o rom\u00e2ntica de que a melhoria da performance ocorre &#8220;escovando <em>bits<\/em>&#8220;, entretanto, na pr\u00e1tica, geralmente os ganhos mais percebidos acontecem por adapta\u00e7\u00f5es do <em>design<\/em> arquitetural, por exemplo, pela adi\u00e7\u00e3o de\u00a0<em>caching,\u00a0<\/em>buscando minimizar o uso de recursos com alto custo computacional, como a rede.<\/p>\nEventualmente, esgotadas as alternativas arquiteturais para otimiza\u00e7\u00e3o, \u00e9 comum observar que, dentro da zona cr\u00edtica de c\u00f3digo (20% que consome 80% de recursos), \u00e9 poss\u00edvel identificar novamente trechos cr\u00edticos &#8211; uma esp\u00e9cie de Pareto<sup>2<\/sup> (6% do c\u00f3digo, respons\u00e1vel por 64% dos recursos). Geralmente, a otimiza\u00e7\u00e3o desses trechos \u00e9 realizada pela escolha apropriada de bons algoritmos e estruturas de dados.\n<hr \/>\n<p>Em sistemas com arquitetura otimizada para a performance, que adotam algoritmos certos e estruturas de dados apropriadas, eventualmente, observa-se uma esp\u00e9cie de\u00a0Pareto<sup>3<\/sup> (0,8% do c\u00f3digo, respons\u00e1vel por 51% dos recursos). Nesses casos, e apenas nesses casos, h\u00e1 espa\u00e7o para implanta\u00e7\u00e3o de micro otimiza\u00e7\u00f5es.<\/p>\n<h2>Rela\u00e7\u00e3o com a escalabilidade<\/h2>\n<p>Performance e escalabilidade s\u00e3o atributos relacionados, por\u00e9m distintos. A escalabilidade diz respeito a capacidade de um sistema de manter sua performance, em cen\u00e1rios de aumento de\u00a0<em>workload<\/em>, mediante a adi\u00e7\u00e3o de recursos computacionais em propor\u00e7\u00e3o favor\u00e1vel.<\/p>\nUm sistema que t\u00eam sua performance deteriorada frente ao aumento do <em>workload<\/em>, sem recupera\u00e7\u00e3o frente a adi\u00e7\u00e3o de recursos computacionais, n\u00e3o \u00e9, de forma alguma, escal\u00e1vel.\u00a0\n<hr \/>\n<p>Para tornar mais clara a diferen\u00e7a, considere um sistema de <em>e-commerce. <\/em>Nele, a performance ter\u00e1 rela\u00e7\u00e3o, por exemplo, com o tempo necess\u00e1rio para que um n\u00famero esperado de clientes efetivem o <em>checkout.<\/em>\u00a0Enquanto isso, a escalabilidade tem rela\u00e7\u00e3o com a capacidade de ajustar o sistema para que quantidades maiores de clientes possam ser atendidos, mediante adi\u00e7\u00e3o razo\u00e1vel de recursos (em propor\u00e7\u00e3o igual ou menor ao crescimento do\u00a0<em>workload<\/em>).<\/p>\n<p><strong>A degrada\u00e7\u00e3o da performance, frente ao aumento do <em>workload,<\/em>\u00a0mesmo com a adi\u00e7\u00e3o\u00a0favor\u00e1vel de recursos, \u00e9 indicador de aten\u00e7\u00e3o para problemas escalabilidade.\u00a0<\/strong><\/p>\n<h2>M\u00e9tricas comuns relacionadas a performance<\/h2>\n<strong>A performance de um sistema deve ser avaliada tanto por m\u00e9tricas de tempo, observ\u00e1veis externamente, quanto pelo consumo de recursos.\u00a0<\/strong>\u00c9 correto afirmar que a performance de um sistema melhora tanto quando os tempos observ\u00e1veis de processamento s\u00e3o reduzidos, quanto quando h\u00e1 diminui\u00e7\u00e3o de demanda por recursos computacionais para cumprir as expectativas de tempo de processamento.\n<hr \/>\n<p>Tendo em vista o cuidado com a utiliza\u00e7\u00e3o de recursos, qualquer m\u00e9trica de consumo poder\u00e1 ser associada a performance. J\u00e1 as m\u00e9tricas de tempo geralmente s\u00e3o\u00a0<em>response time<\/em>, <em>turnaround time<\/em>\u00a0ou\u00a0<i>throughput<\/i>.<\/p>\n<p>Eventualmente, o uso combinado de m\u00e9tricas de tempo e de consumo d\u00e3o origem a bons indicadores.<\/p>\nTodas as m\u00e9tricas relacionadas a performance s\u00e3o candidatas a composi\u00e7\u00e3o de <em>fitness functions.<\/em>\n<hr \/>\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;\"><em>Response time<\/em> ou <em>Turnaround time<\/em>, nunca ambos<\/p>\r\n<\/p>\n<p>Considere uma API cujo uma das atribui\u00e7\u00f5es \u00e9 receber arquivos, potencialmente grandes, com grande quantidade de dados para processamento. Como avaliar sua performance? Pelo\u00a0<em>response time<\/em>, considerando tempo de resposta para o usu\u00e1rio ap\u00f3s a requisi\u00e7\u00e3o, ou pelo\u00a0<em>turnaround time<\/em>, considerando o tempo total para processamento do arquivo recebido?<\/p>\n<p>Processar arquivos grandes em uma interface interativa compromete o\u00a0<em>response time,\u00a0<\/em>n\u00e3o s\u00f3 daquela requisi\u00e7\u00e3o, mas de todas as demais para aquele servi\u00e7o. Afinal, &#8220;segura&#8221; recursos importantes e gera enfileiramento.<\/p>\n<p>A abordagem mais recomendada \u00e9 enfileirar o arquivo grande em um servi\u00e7o de <em>backend,\u00a0<\/em>que ser\u00e1 avaliado pelo\u00a0<em>turnaround time\u00a0<\/em>e responder o mais r\u00e1pido poss\u00edvel, ou seja, com o melhor\u00a0<em>response time.<\/em><\/p>\n<p>Se h\u00e1 d\u00favidas sobre qual indicador usar, geralmente, a sa\u00edda \u00e9 decompor solu\u00e7\u00e3o em dois componentes, cada um com sua m\u00e9trica apropriada.<\/p>\n<p><\/div>\n<h4><em>Response time<\/em><\/h4>\n<p>Em sistemas com intera\u00e7\u00e3o com usu\u00e1rios, o\u00a0<em>response time\u00a0<\/em>indica o tempo consumido entre uma tarefa (ou a\u00e7\u00e3o) ser disparada e uma resposta satisfat\u00f3ria ser gerada. <strong>Valores comuns para\u00a0<em>response time\u00a0<\/em>s\u00e3o, geralmente, expressos de fra\u00e7\u00f5es de segundo.<\/strong><\/p>\nQuando aplic\u00e1vel, o <em>response time<\/em> costuma ser a m\u00e9trica de performance mais observada. Afinal, \u00e9 aquela que tem rela\u00e7\u00e3o mais pr\u00f3xima com a satisfa\u00e7\u00e3o dos usu\u00e1rios.\n<hr \/>\nSistemas com bom projeto de performance devem manter <em>response time\u00a0<\/em>regular, com pouca ou nenhuma degrada\u00e7\u00e3o frente ao aumento do <em>workload<\/em>, desde que n\u00e3o ocorra satura\u00e7\u00e3o dos recursos computacionais indicados como restri\u00e7\u00e3o.\n<hr \/>\n<h4><em>Turnaround time<\/em><\/h4>\n<p>Quando h\u00e1 necessidade de avaliar a performance do processamento de lotes de dados, como em din\u00e2micas de consolida\u00e7\u00e3o, a m\u00e9trica de a ser observada \u00e9 o\u00a0<em>turnaround time<\/em>, ou seja,\u00a0o tempo transcorrido entre o in\u00edcio do processamento do lote e a conclus\u00e3o. <strong>Valores para\u00a0<em>turnaround time\u00a0<\/em>podem ser expressos em segundos, minutos, horas e at\u00e9 dias.<\/strong><\/p>\n<p>N\u00e3o \u00e9 incomum que o neg\u00f3cio relacione o\u00a0<em>turnaround time\u00a0<\/em>com &#8220;janelas de processamento&#8221;. Ou seja, per\u00edodos regulares, bem-definidos, que precisam ser respeitados.<\/p>\n<h4><em>Throughput<\/em><\/h4>\n<p><strong>O <em>throughput\u00a0<\/em>tem rela\u00e7\u00e3o com a quantidade de opera\u00e7\u00f5es de um determinado tipo que um sistema consegue executar em um intervalo de tempo definido.<\/strong><\/p>\n<p>Para fins de compara\u00e7\u00e3o, quando os lotes de processamento t\u00eam tamanho significativamente vari\u00e1vel, ou em opera\u00e7\u00f5es ass\u00edncronas respondendo uma fila, \u00e9 interessante medir o <em>throughput<\/em>.<\/p>\n<p>O <em>throughput\u00a0<\/em>tamb\u00e9m \u00e9 ser utilizado como indicativo de quantas requisi\u00e7\u00f5es um sistema consegue atender simultaneamente.<\/p>\n<h2>Rela\u00e7\u00e3o com recursos computacionais<\/h2>\n<p><strong>H\u00e1 uma rela\u00e7\u00e3o forte entre a performance de um sistema e a capacidade dele de utilizar recursos adequadamente.\u00a0<\/strong><\/p>\nMelhorar a performance de um sistema geralmente implica em: 1) fazer melhor uso dos recursos computacionais ou 2) aumentar a quantidade de recursos computacionais dispon\u00edveis. Obviamente, o aumento de recursos computacionais, embora frequentemente efetivo, implica no incremento direto do custo.\n<hr \/>\n<p>A melhor utiliza\u00e7\u00e3o dos recursos computacionais pode acontecer tanto pela utiliza\u00e7\u00e3o de t\u00e9cnicas de otimiza\u00e7\u00e3o de c\u00f3digo quanto pela &#8220;substitui\u00e7\u00e3o&#8221; do uso de recursos computacionais mais caros (por exemplo, acesso a disco ou a um servidor remoto) por outros mais baratos (mem\u00f3ria RAM).<\/p>\n<h2>Rela\u00e7\u00e3o com filas<\/h2>\n<strong>A utiliza\u00e7\u00e3o adequada de recursos computacionais, essencial para a boa performance, depende do entendimento b\u00e1sico da teoria das filas.<\/strong>\n<hr \/>\n<p><strong>A maioria dos recursos computacionais &#8211; tais como processadores, discos e mecanismos para transfer\u00eancia de dados &#8211; \u00a0implementam algum suporte para enfileiramento.<\/strong> Em sistemas Web, por exemplo, requisi\u00e7\u00f5es s\u00e3o enfileiradas sempre que o ritmo de chegada de novas requisi\u00e7\u00f5es (<em>arrival rate &#8211;\u00a0<\/em>ex: 5 req\/s) for maior do que o ritmo com que os servidores conseguem atender essas requisi\u00e7\u00f5es (<em>service rate &#8211; <\/em>ex: 3 req\/s). O\u00a0<em>traffic\u00a0<\/em><i>intensity\u00a0<\/i>\u00e9 determinado pela propor\u00e7\u00e3o percentual entre\u00a0<em>arrival rate\u00a0<\/em>e\u00a0<em>service rate<\/em>.<\/p>\n<p><img decoding=\"async\" class=\"wp-image-2509 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/queues.jpg\" alt=\"\" width=\"595\" height=\"297\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/queues.jpg 1091w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/queues-300x150.jpg 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/queues-1024x512.jpg 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/queues-768x384.jpg 768w\" sizes=\"(max-width: 595px) 100vw, 595px\" \/><\/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;\">Conten\u00e7\u00e3o e Disponibilidade de Recursos<\/p>\r\n<\/p>\n<p>Eventualmente, o enfileiramento n\u00e3o \u00e9 &#8220;suportado&#8221; por um recurso em si, mas acontece em decorr\u00eancia do pr\u00f3prio fluxo de execu\u00e7\u00e3o do c\u00f3digo e concorr\u00eancia.<\/p>\n<p>Quando um recurso computacional est\u00e1 sob conten\u00e7\u00e3o, ou seja, &#8220;bloqueado&#8221; atendendo uma demanda, nega novas requisi\u00e7\u00f5es e cabe aos demandantes estabelecer pol\u00edticas de retentativas, estabelecendo uma esp\u00e9cie de enfileiramento.<\/p>\n<p>Eventualmente, um recurso est\u00e1 indispon\u00edvel, mesmo que inoperante. Nesses casos, tamb\u00e9m caber\u00e1 aos &#8220;demandantes&#8221; implementar pol\u00edticas de retentativa.<\/p>\n<p><\/div>\n<p><strong>Quando o <em>traffic intensity<\/em> permanece acima de 100% por algum tempo, h\u00e1 um aumento na <i>queue length\u00a0<\/i>(quantidade de demandas esperando por serem atendidas e sendo atendidas em um determinado momento)\u00a0e no\u00a0<em>wait time <\/em>(tempo total na fila).<\/strong> A consequ\u00eancia direta observ\u00e1vel \u00e9 a degrada\u00e7\u00e3o da performance. Al\u00e9m disso, caso demandas expirem (por\u00a0<em>time-out<\/em>) ou o limite de capacidade da fila seja atingido, constata-se satura\u00e7\u00e3o do recurso.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2511 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/saturation.jpg\" alt=\"\" width=\"387\" height=\"322\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/saturation.jpg 793w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/saturation-300x250.jpg 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/saturation-768x639.jpg 768w\" sizes=\"(max-width: 387px) 100vw, 387px\" \/><\/p>\n<p><strong>Idealmente, recursos muito demandados devem, ao longo do tempo, otimizar o <em>service time<\/em>\u00a0<\/strong>(tempo necess\u00e1rio para um recurso atender uma demanda e estar pronto para atender uma pr\u00f3xima) como medida para impactar menos o\u00a0<em>response time <\/em>e, tamb\u00e9m, evitar a satura\u00e7\u00e3o.<\/p>\n<p>A forma natural de &#8220;aliviar&#8221; o\u00a0<em>traffic intensity\u00a0<\/em>\u00e9 paralelizando o atendimento das demandas em diversas inst\u00e2ncias do tipo de recurso computacional sendo demandado. Dessa forma, fazendo com que o <em>service rate\u00a0<\/em>supere o\u00a0<i>arrival rate<\/i>.<\/p>\n<p>Em um sistema saud\u00e1vel, onde demandas n\u00e3o s\u00e3o perdidas e o\u00a0<em>traffic intensity\u00a0<\/em>seja menor que 100%, o\u00a0<em>throughput\u00a0<\/em>ser\u00e1 igual ao\u00a0<em>arrival rate<\/em>.<\/p>\n<h4>Filas causam quedas em &#8220;efeito domin\u00f3&#8221;<\/h4>\n<p>A imagem abaixo relata comportamento de um sistema durante um incidente de performance e demonstra uma caracter\u00edstica comum.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2567 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/67ab600c-fc1f-4148-a979-b96876f6d70d.jpeg\" alt=\"\" width=\"850\" height=\"484\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/67ab600c-fc1f-4148-a979-b96876f6d70d.jpeg 850w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/67ab600c-fc1f-4148-a979-b96876f6d70d-300x171.jpeg 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/67ab600c-fc1f-4148-a979-b96876f6d70d-768x437.jpeg 768w\" sizes=\"(max-width: 850px) 100vw, 850px\" \/><\/p>\n<p>A forma\u00e7\u00e3o de filas, frente a determinados recursos que est\u00e3o indispon\u00edveis, seja por conten\u00e7\u00e3o ou prontid\u00e3o, acaba estressando outras partes de um sistema, notoriamente CPU, gerando quedas em domin\u00f3.<\/p>\n<h4><em>Utilization Law<\/em><\/h4>\n<p><strong>A\u00a0<em>utilization law\u00a0<\/em>aponta que a taxa de utiliza\u00e7\u00e3o de um recurso computacional (eventualmente paralelizado) pode ser determinada pelo produto de seu\u00a0<em>throughput\u00a0<\/em>e a m\u00e9dia do\u00a0<em>service time<\/em>.<\/strong> Por exemplo, um recurso que trata 3 requisi\u00e7\u00f5es por segundo, com um <em>service time<\/em> de 100ms tem utiliza\u00e7\u00e3o de 0.3 (ou, 30%).<\/p>\n<p><strong>Idealmente, a taxa de utiliza\u00e7\u00e3o de um recurso computacional n\u00e3o deve ultrapassar 80%.<\/strong><\/p>\n<h2>T\u00e1ticas modernas para garantir a performance<\/h2>\n<p>Sistemas com boa performance s\u00e3o aqueles que conseguem, utilizando os recursos computacionais especificados nas restri\u00e7\u00f5es, garantir que o tempo m\u00e9dio de atendimento de demandas, combinando processamentos (<em>service times<\/em>) e esperas (<em>wait times<\/em>), esteja conforme aos objetivos do neg\u00f3cio. Para isso, devem manter a taxa de utiliza\u00e7\u00e3o desses recursos computacionais abaixo de 80% considerando a carga m\u00e1xima prevista.<\/p>\n<p>A garantia da performance se d\u00e1, ent\u00e3o, pelo controle rigoroso do <em>arrival rate\u00a0<\/em>limitando-o ao especificado no projeto da arquitetura e ao equil\u00edbrio entre o\u00a0<em>service time <\/em>e o\u00a0<em>wait time\u00a0<\/em>para garantir que o\u00a0<em>response time <\/em>de cada recurso\u00a0seja o estipulado. Seja pela otimiza\u00e7\u00e3o do recurso em si, ou pelo\u00a0<i>tuning\u00a0<\/i>do ambiente (determinando n\u00famero de inst\u00e2ncias)<\/p>\n<p>Embora as medidas para melhoria de performance dependam de especificidades de cada sistema, h\u00e1 um conjunto comum de t\u00e1ticas frequentemente adotadas, sobretudo sob o ponto de vista arquitetural.<\/p>\n<h4>Prioriza\u00e7\u00e3o de\u00a0<em>requests<\/em><\/h4>\n<p><strong>Todas as\u00a0<em>requests\u00a0<\/em>s\u00e3o importantes. Mas, algumas s\u00e3o mais importantes que as outras.\u00a0<\/strong>Eventualmente, um sistema precisar\u00e1 garantir recursos suficientes para atender uma categoria requisi\u00e7\u00f5es em detrimento de outras.<\/p>\n<p>Uma medida comum \u00e9 apartar a infraestrutura, dedicando recursos ao atendimento exclusivo de determinadas funcionalidades, separando enfileiramentos. N\u00e3o raro, \u00e9 \u00fatil segmentar tamb\u00e9m o sistema de software em componentes, facilitando processos de <em>deploy<\/em> e manuten\u00e7\u00e3o.<\/p>\n<p>Outra boa medida para suportar a performance \u00e9 desacoplar requisi\u00e7\u00f5es mais complexas em etapas mais simples, usando, ent\u00e3o,\u00a0abordagens ass\u00edncronas, melhorando a performance percebida com respostas r\u00e1pidas, enquanto parte do processamento fica postergado.<\/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;\">Desacoplando o aceite e a confirma\u00e7\u00e3o de pedidos<\/p>\r\n<\/p>\n<p>Sistemas de <em>e-commerce\u00a0<\/em>t\u00eam adotado, frequentemente, a separa\u00e7\u00e3o do aceite de um pedido e a confirma\u00e7\u00e3o mediante pagamento.<\/p>\n<p>O aceite do pedido acontece rapidamente, com \u00f3timo\u00a0<em>response time.\u00a0<\/em>Entretanto, este limita-se a &#8220;enfileirar&#8221; solicita\u00e7\u00e3o para confirma\u00e7\u00e3o, que \u00e9 um processo com maior custo computacional.<\/p>\n<p>Aceitar pedidos rapidamente \u00e9 prioridade frente a confirmar pedidos!<\/p>\n<p><\/div>\n<h4>Redu\u00e7\u00e3o do <em>overhead\u00a0<\/em>com chamadas remotas<\/h4>\n<p>Rede e GC s\u00e3o duas fontes comuns de problemas de performance. O agrupamento de servi\u00e7os pode reduzir boa parte da press\u00e3o sobre a rede e um bocado de interven\u00e7\u00f5es dos mecanismos de GC, demandando menos filas e melhorando o <em>service time<\/em>.<\/p>\nComponentes <em>cross-cutting\u00a0<\/em>tamb\u00e9m podem se converter, rapidamente, em gargalos de processamento e devem ser adotados com parcim\u00f4nia. Nada mais infeliz do que ver a performance de um sistema comprometida por mecanismos ing\u00eanuos de <em>logging<\/em>\u00a0e seguran\u00e7a.\n<h4>Ado\u00e7\u00e3o de <em>Rate limiters<\/em><\/h4>\n<p>A performance de um sistema tem clara rela\u00e7\u00e3o com as restri\u00e7\u00f5es relacionadas aos recursos ao ambiente operacional. O esperado \u00e9 que a performance se mantenha previs\u00edvel enquanto houverem recursos dispon\u00edveis, geralmente, entretanto, ela \u00e9 comprometida quando os limites de recursos s\u00e3o ultrapassados. Por isso, uma das formas de proteger da performance \u00e9 a utiliza\u00e7\u00e3o de\u00a0<i>rate\u00a0limiters.<\/i><\/p>\n<p><em>Rate limiters <\/em>podem ser implementados em <em>client-side<\/em>, <em>server-side <\/em>ou em um <em>middleware<\/em>. Implementa\u00e7\u00f5es em <em>client-side <\/em>tem como m\u00e9rito principal a redu\u00e7\u00e3o da press\u00e3o sobre a rede. J\u00e1 implementa\u00e7\u00f5es em <em>server-side <\/em>ou <em>middleware<\/em> s\u00e3o mais \u201cconfi\u00e1veis\u201d, por estarem em ambientes gerenciados, e robustas, visto que permitem regras mais complexas.<\/p>\n<p><strong>De forma pr\u00e1tica, a estrat\u00e9gia consistem em limitar o\u00a0<em>throughput\u00a0<\/em>como forma de proteger o\u00a0<em>response time<\/em>.<\/strong><\/p>\n<h4>Qualifica\u00e7\u00e3o no consumo de recursos<\/h4>\n<p>Eventualmente, pode ser importante revisar a implementa\u00e7\u00e3o dos componentes para garantir que recursos estejam sendo utilizados de maneira eficiente. N\u00e3o raro, por exemplo, mem\u00f3ria e CPU s\u00e3o comprometidos desnecessariamente em fun\u00e7\u00e3o de implementa\u00e7\u00f5es ing\u00eanuas, causando aumento do <em>service time<\/em>. Outros bons exemplos s\u00e3o conex\u00f5es com banco de dados e uso impr\u00f3prio do sistema de arquivos que, com frequ\u00eancia, implicam em enfileiramentos.<\/p>\n<h4>Ado\u00e7\u00e3o de programa\u00e7\u00e3o paralela e concorrente<\/h4>\n<p>Componentes devem aumentar o\u00a0<em>throughput\u00a0<\/em>usando\u00a0<em>scale out\u00a0<\/em>, seja externamente, pela cria\u00e7\u00e3o de mais inst\u00e2ncias, devidamente balanceadas, seja internamente, pela ado\u00e7\u00e3o de\u00a0<em>threads.\u00a0<\/em>Essas medidas reduzem filas de requisi\u00e7\u00f5es.<\/p>\n<p>Em sistemas modelados para alto n\u00edvel de paralelismo, \u00e9 essencial evitar <span style=\"text-decoration: underline;\">conten\u00e7\u00e3o de recursos<\/span>. Isso \u00e9 poss\u00edvel tentando criar o m\u00ednimo poss\u00edvel de recursos que possam ser utilizados apenas por um \u00fanico &#8220;cliente&#8221; por vez.<\/p>\n<h4>Implementa\u00e7\u00e3o de <em>Caching<\/em><\/h4>\n<p><strong>Caching pode gerar aumento percept\u00edvel de performance!<\/strong> Seja para evitar consultas complexas para o banco de dados ou para armazenar o resultado de computa\u00e7\u00e3o de alto custo,\u00a0<em>caching\u00a0<\/em>\u00e9 uma forma simples de substituir recursos de custo elevado por outros mais baratos, evitando enfileiramentos.<\/p>\n<h4>Aumentar a quantidade de recursos<\/h4>\n<p>Em muitas condi\u00e7\u00f5es, pode-se amenizar e at\u00e9 resolver problemas de performance utilizando melhor infraestrutura. Entretanto, \u00e9 importante estar atento que &#8220;colocar mais lata&#8221; (<em>scale up<\/em>) \u00e9 uma solu\u00e7\u00e3o paliativa e raramente sustent\u00e1vel no longo prazo.<\/p>\n<h2>Sumarizando<\/h2>\n<p>A performance \u00e9 caracter\u00edstica fundamental em qualquer arquitetura. Ela impacta muitos outros atributos de qualidade, sobretudo o custo de um sistema. Para ser bem projetada, depende do alinhamento de expectativas quanto a tempos de processamento e volumes de <em>workload.<\/em><\/p>\n<p>Melhorias de performance geralmente est\u00e3o associadas com uso mais adequado de recursos computacionais. Quanto melhor o uso, mais performance.\u00a0Um bom indicativo do uso efetivo dos recursos computacionais est\u00e1 na forma\u00e7\u00e3o de filas &#8220;saud\u00e1veis&#8221; que garantam\u00a0<em>throughput<\/em> equivalente ao\u00a0<em>arrival rate.<\/em><\/p>\n<h2>\/\/ TODO<\/h2>\n<p>Antes de avan\u00e7ar para o pr\u00f3ximo cap\u00edtulo, recomendo a voc\u00ea as seguintes reflex\u00f5es:<\/p>\n<ul>\n<li>Quais s\u00e3o os recursos computacionais que tem causado maiores problemas de performance no sistema em que voc\u00ea est\u00e1 trabalhando agora?<\/li>\n<li>Quais s\u00e3o as taxas de utiliza\u00e7\u00e3o desses recursos?<\/li>\n<\/ul>\n","protected":false},"featured_media":2502,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[],"sessoes":[58],"apendices":[],"capitulos":[39],"class_list":["post-2561","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","sessoes-secao-2","capitulos-capitulo-2-3"],"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 com boa performance \/ Cap\u00edtulo 12 v 1.03 - 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-com-boa-performance-capitulo-12-v-1-03\/\" \/>\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 com boa performance \/ Cap\u00edtulo 12 v 1.03 - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Pela relev\u00e2ncia, as expectativas m\u00ednimas de boa performance devem ser determinadas o mais cedo poss\u00edvel. Depois disso, devem ser consideradas na avalia\u00e7\u00e3o das proposi\u00e7\u00f5es de design arquiteturais\u00a0candidatas. &nbsp; Definindo performance De maneira superficial, performance, como atributo de qualidade, trata do tempo que um sistema necessita para completar uma determinada categoria de atividades.\u00a0De forma mais precisa, [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/\" \/>\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:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/braden-collum-9HI8UJMSdZA-unsplash.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\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=\"19 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-com-boa-performance-capitulo-12-v-1-03\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/\",\"name\":\"Fundamentos para arquitetura de sistemas com boa performance \/ Cap\u00edtulo 12 v 1.03 - 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-com-boa-performance-capitulo-12-v-1-03\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/braden-collum-9HI8UJMSdZA-unsplash.jpg\",\"datePublished\":\"2021-07-01T12:43:35+00:00\",\"dateModified\":\"2024-01-11T20:59:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/braden-collum-9HI8UJMSdZA-unsplash.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/braden-collum-9HI8UJMSdZA-unsplash.jpg\",\"width\":1200,\"height\":800},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/#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 com boa performance \/ Cap\u00edtulo 12 v 1.03\"}]},{\"@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 com boa performance \/ Cap\u00edtulo 12 v 1.03 - 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-com-boa-performance-capitulo-12-v-1-03\/","og_locale":"pt_BR","og_type":"article","og_title":"Fundamentos para arquitetura de sistemas com boa performance \/ Cap\u00edtulo 12 v 1.03 - Manual do Arquiteto de Software","og_description":"Pela relev\u00e2ncia, as expectativas m\u00ednimas de boa performance devem ser determinadas o mais cedo poss\u00edvel. Depois disso, devem ser consideradas na avalia\u00e7\u00e3o das proposi\u00e7\u00f5es de design arquiteturais\u00a0candidatas. &nbsp; Definindo performance De maneira superficial, performance, como atributo de qualidade, trata do tempo que um sistema necessita para completar uma determinada categoria de atividades.\u00a0De forma mais precisa, [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-11T20:59:08+00:00","og_image":[{"width":1200,"height":800,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/braden-collum-9HI8UJMSdZA-unsplash.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"19 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/","name":"Fundamentos para arquitetura de sistemas com boa performance \/ Cap\u00edtulo 12 v 1.03 - 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-com-boa-performance-capitulo-12-v-1-03\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/braden-collum-9HI8UJMSdZA-unsplash.jpg","datePublished":"2021-07-01T12:43:35+00:00","dateModified":"2024-01-11T20:59:08+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/braden-collum-9HI8UJMSdZA-unsplash.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/06\/braden-collum-9HI8UJMSdZA-unsplash.jpg","width":1200,"height":800},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/fundamentos-para-arquitetura-de-sistemas-com-boa-performance-capitulo-12-v-1-03\/#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 com boa performance \/ Cap\u00edtulo 12 v 1.03"}]},{"@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\/2561","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=2561"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/2502"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=2561"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=2561"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=2561"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=2561"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=2561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}