<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vitória Lopes</title>
    <description>The latest articles on DEV Community by Vitória Lopes (@vitoria).</description>
    <link>https://dev.to/vitoria</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F457772%2F07aba42b-fd92-4c3f-94c2-c74fd55ffaca.jpeg</url>
      <title>DEV Community: Vitória Lopes</title>
      <link>https://dev.to/vitoria</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vitoria"/>
    <language>en</language>
    <item>
      <title>System design - princípios da escalabilidade de sistemas através da distribuição</title>
      <dc:creator>Vitória Lopes</dc:creator>
      <pubDate>Wed, 13 Sep 2023 14:00:57 +0000</pubDate>
      <link>https://dev.to/vitoria/system-design-principios-da-escalabilidade-de-sistemas-atraves-da-distribuicao-671</link>
      <guid>https://dev.to/vitoria/system-design-principios-da-escalabilidade-de-sistemas-atraves-da-distribuicao-671</guid>
      <description>&lt;p&gt;A escalabilidade é um requisito fundamental para o sucesso de sistemas modernos, especialmente diante do crescente volume de dados e da demanda por desempenho. Para atender a essas necessidades, a distribuição das funcionalidades de um sistema é uma interessante estratégia.&lt;/p&gt;

&lt;p&gt;Seu principal objetivo é aumentar o poder computacional e disponibilidade para a resolução de problemas utilizando diferentes máquinas  que trabalham de forma uniforme como um sistema único.&lt;/p&gt;

&lt;h2&gt;
  
  
  Princípios
&lt;/h2&gt;

&lt;p&gt;Para construir um verdadeiro sistema distribuído e alcançar os objetivos dessa distribuição é importante ter alguns princípios como metas de design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Escalabilidade
&lt;/h3&gt;

&lt;p&gt;Para compreender este princípio, iremos analisar as 3 dimensões em que ele pode ser aplicado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade em tamanho&lt;/strong&gt; → o sistema pode escalar em número de usuários e recursos sem perca de performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade geográfica&lt;/strong&gt; → apesar da distância geográfica de usuários e recursos, delays de comunicação são dificilmente notados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade administrativa&lt;/strong&gt; → o sistema pode ser facilmente gerenciável mesmo que seus componentes e usuários estejam sob diferentes administrações de rede.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Existem, porém, algumas dificuldades na aplicação deste princípio, uma vez que nenhum componente do sistema possui informação completa sobre o estado global do sistema, tomando decisões baseadas na informação disponível localmente.&lt;/p&gt;

&lt;p&gt;Não se pode, também, assumir a existência de um relógio global, uma vez que cada componente pode estar sob um fuso horário diferente. A comunicação assíncrona, portanto, seria o ideal, embora nem sempre é possível dado o contexto de funcionamento/utilização do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transparência
&lt;/h3&gt;

&lt;p&gt;Torna a utilização de processos e recursos distribuídos invisível para usuários finais e demais aplicações que interagem com o sistema.&lt;br&gt;
Existem diferentes aspectos onde a transparência pode ser aplicada. Entre eles, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transparência de localização&lt;/strong&gt; → usuários não são capazes de dizer onde um objeto está fisicamente armazenado no sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparência de migração&lt;/strong&gt; → o sistema suporta a migração de recursos e processos sem afetar comunicações e operações em andamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparência de replicação&lt;/strong&gt; → uso de diferentes cópias do mesmo sistema com o objetivo de aumentar a disponibilidade ou eficiência de processamento não é aparente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparência de concorrência&lt;/strong&gt; → a concorrência pela utilização de recursos computacionais entre os diferentes componentes do sistema não é aparente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparência de falhas&lt;/strong&gt; →o sistema é resiliente a falhas, de modo que o usuário não percebe a ocorrência de um erro com algum componente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparência de acesso&lt;/strong&gt; → o acesso a recursos é uniforme apesar da possibilidade de localização dos componentes em diferentes sistemas operacionais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparência de realocação&lt;/strong&gt; → a realocação de recursos (mudança de servidor, por exemplo) não é perceptível pelo usuário.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O grau de transparência pode variar muito dependendo do contexto e intenção do sistema. Em algumas situações, pode ser preferível expor a distribuição ao invés de mascará-la e tornar a experiência de uso do sistema ruim (pelo fuso horário dos servidores ou lentidões na rede, por exemplo), de modo que  o usuário possa compreender melhor comportamentos inesperados do sistema e saber como lidar com eles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Abertura
&lt;/h3&gt;

&lt;p&gt;Um sistema distribuído aberto é um sistema capaz de oferecer componentes que podem ser facilmente utilizados ou integrados por outros sistemas, além de integrar componentes de qualquer outro lugar para extender o sistema. Deve ser simples configurar sistemas formados por diferentes componentes (de diferentes equipes de desenvolvimento) utilizando uma interface comum.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resiliência
&lt;/h3&gt;

&lt;p&gt;Este princípio se refere ao grau em que o sistema distribuído é confiável para operar conforme o esperado, apesar da possibilidade de ocorrência de falhas. Caso algum componente falhe, o sistema deve ser tolerante e continuar funcionando adequadamente.&lt;/p&gt;

&lt;p&gt;A resiliência se apoia sobre 4 conceitos importantes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Disponibilidade&lt;/strong&gt; → o sistema está sempre disponível para utilização.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confiabilidade&lt;/strong&gt; → o sistema é capaz de operar continuamente sem falhas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recuperação&lt;/strong&gt; → quando o sistema falha temporariamente, nenhum evento catastrófico ocorre.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenabilidade&lt;/strong&gt; → quão facilmente o sistema pode ser reparado em caso de falhas.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Segurança
&lt;/h3&gt;

&lt;p&gt;Garantia de confiabilidade e integridade das informações operadas pelo sistema. É preciso que o acesso à informação e aos diferentes componentes do sistema seja controlado mediante níveis de autorização específicos para os diferentes tipos de usuários capazes de operá-lo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compartilhamento de recursos
&lt;/h3&gt;

&lt;p&gt;Princípio que garante a facilidade para usuários e aplicações acessarem e compartilharem remotamente recursos utilizando o sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Técnicas
&lt;/h2&gt;

&lt;p&gt;Alcançar as metas de design em acordo com o objetivo geral dos sistemas distribuídos envolve a aplicação de diferentes técnicas, que variam de acordo com o contexto. Em breve tratei as principais.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;M. van Steen and A.S. Tanenbaum, Distributed Systems, 4th ed., &lt;a href="http://distributed-systems.net/"&gt;distributed-systems.net&lt;/a&gt;, 2023.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Obrigada pela leitura! Compartilhe suas ideias sobre o tema nos comentários 😊&lt;/p&gt;

&lt;p&gt;Minhas redes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/stoneparker"&gt;https://github.com/stoneparker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/vitorialopesdiogo/"&gt;https://www.linkedin.com/in/vitorialopesdiogo/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>computerscience</category>
      <category>distributedsystems</category>
      <category>systemdesign</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
