System design - princípios da escalabilidade de sistemas através da distribuição
Tags: computerscience, distributedsystems, systemdesign, braziliandevs
Published: 2023-09-13 14:00:57

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.

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.

## Princípios

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

### Escalabilidade

Para compreender este princípio, iremos analisar as 3 dimensões em que ele pode ser aplicado:

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

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.

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.

### Transparência

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.
Existem diferentes aspectos onde a transparência pode ser aplicada. Entre eles, temos:

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

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.

### Abertura

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.

### Resiliência

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.

A resiliência se apoia sobre 4 conceitos importantes:

1. **Disponibilidade** → o sistema está sempre disponível para utilização.
2. **Confiabilidade** → o sistema é capaz de operar continuamente sem falhas.
3. **Recuperação** → quando o sistema falha temporariamente, nenhum evento catastrófico ocorre.
4. **Manutenabilidade** → quão facilmente o sistema pode ser reparado em caso de falhas.

### Segurança

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.

### Compartilhamento de recursos

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

## Técnicas

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.

---

## Referências

- M. van Steen and A.S. Tanenbaum, Distributed Systems, 4th ed., [distributed-systems.net](http://distributed-systems.net/), 2023.

---

Obrigada pela leitura! Compartilhe suas ideias sobre o tema nos comentários 😊

Minhas redes:

- Github: https://github.com/stoneparker
- LinkedIn: https://www.linkedin.com/in/vitorialopesdiogo/