Escalabilidade: Conceitos e boas práticas

Escalabilidade é a capacidade que um sistema possui para gerenciar uma quantidade elevada de processos ou o potencial para elevar a largura de processamento a fim de acomodar o crescimento de tarefas.

Basicamente refere-se à capacidade de um sistema aumentar a sua produção total sob o aumento de carga quando os recursos de hardware são adicionados.
Sem sombra de dúvidas escalabilidade deve ser pensada em tempo de design da aplicação, pois isso não é uma característica que podemos adicionar em nossa aplicação mais tarde. Decisões que tomamos durante a codificação, nas fases iniciais do projeto, ditam a escalabilidade da nossa aplicação.
Escalabilidade de aplicações requer um balanço entre dois domínios distintos. Por exemplo, apenas implementar um cluster com servidores de load-alance não quer dizer que a aplicação apresentará uma peformance melhor que aplicação que foi desenhada para ser executada em uma única máquina.
Quando abordamos o assunto de escalabilidade vamos além das aplicações tradicionais cliente-servidor e começamos a pensar em aplicações distribuídas. Aplicações distribuídas são desenhas com N camadas de aplicações que propõe o compartilhamento de recursos, tais como componentes de negócios e base de dados.


Escalabilidade vertical – (Scalling-up)

Scalling-Up ou escalabilidade vertical são termos geralmente utilizados para alcançarmos uma maior performance da nossa aplicação utilizando o melhor e mais rápido hardware. Isso inclui a adição de mais recursos para o nosso servidor, tais como:

• Memória
• Processador
• Disco

A escalabilidade vertical também nos permite utilizar a tecnologia de softwares de virtualização, uma vez que esse software fornece mais recursos para os módulos hospedados no SO (Sistema Operacional), esse recurso também pode ser chamado de ampliação, como a expansão de processos. A escalabilidade do aplicativo refere-se ao melhor desempenho das aplicações em execução.


Escalabilidade horizontal – (Scalling-out)

Scalling-out ou Escalabilidade horizontal significa adicionar mais recursos para um conjunto de servidores, com a queda dos preços de computadores e o crescimento contínuo de potência de processamento, as aplicações de alto desempenho, tais como:

• Análise de dados
• Análise biotecnológicas

Adotaram sistemas de commodities para tarefas que antigamente teriam a necessidade de possuir supercomputadores, ao dedicar várias máquinas para uma tarefa comum, a tolerância a falhas da aplicação aumenta. Do ponto de vista administrativo a escalabilidade vertical apresenta um desafio maior de gestão, devido ao aumento do número de máquinas.

Desenvolvedores e administradores da infraestrutura utilizam diversas técnicas de load-balance para escalar horizontalmente. O load-balance permite que uma aplicação escale em um cluster de servidores, fornecendo uma certa facilidade para adicionar mais servidores replicados. Também fornece a redundância dando os recursos de failover local, cada servidor adicional proporciona um aumento praticamente linear em termos de escalabilidade.
O ponto chave para escalar horizontalmente é a transparência da localização do servidor, se o código da aplicação precisa saber qual servidor está executando uma determinada tarefa, o nosso objetivo de transparência de localização não foi alcançado e o dimensionamento será difícil, a aplicação deve ser desenvolvida com o pensamento em escalabilidade de um servidor para muitos, que não é uma opção econômica, abaixo temos uma imagem que ilustra a escalabilidade horizontal.


Desenhando aplicações para escalabilidade

Como já vimos nos tópicos acima o design da aplicação dita muito o quão escalável a aplicação vai ser, um bom projeto é fundamental para escalar sua aplicação e em nenhum outro momento do ciclo de vida da aplicação podemos tomar uma decisão que impacte na escalabilidade da aplicação, por isso devemos ter muito cuidado ao desenhar as nossas aplicações.


Pirâmide da escalabilidade

Como podemos ver na imagem que ilustra a pirâmide da escalabilidade, o hardware tuning e o product tuning são uma pequena fatia nessa equação. A base da nossa aplicação é o design e a codificação, essa pirâmide nos mostra que com um design inteligente podemos adicionar mais escalabilidade para uma aplicação.
Quando estamos desenhando uma aplicação pensando na escalabilidade o objetivo principal é garantir o gerenciamento de recursos eficiente, pois com esse tipo de design não existe limites para qualquer camada ou componente de aplicação onde devemos considerar a escalabilidade em todos os níveis desde a interface com o usuário até a base de dados.









Os 5 mandamentos do design para escalabilidade

Não espere – (Do not wait)

Um processo nunca deve aguardar mais tempo que o necessário, cada pedaço de tempo que um processo utiliza um recurso, é a mesmo pedaço de tempo que um outro processo está aguardando para ser executado, devemos separar os nossos processos em duas categorias: síncrona e assíncrona.
Existem certos momentos onde a nossa aplicação deve executar processos de forma síncrona, por exemplo: Executamos um determinado método, onde precisamos aguardar o seu resultado para saber se a sua ação foi bem executada ou não. Assim todas as operações que estão relacionadas ao processo do exemplo dependem do resultado do mesmo.
Uma forma de conseguirmos escalar nossa aplicação é através de operações assíncronas, quando estamos manipulando operações assíncronas de longa duração, elas são adicionadas para uma fila para serem concluídas mais tarde por um processo separado.


Não lute por recursos – (Do not fight for resources)

A contenção de recursos é a principal causa dos problemas de escalabilidade. Independente do design, toda aplicação tem uma quantidade finita de recursos. Além de realizar o aceleramento das tarefas de longa duração, nós podemos tomar outras medidas para evitar a contenção de recursos.
Quando estamos executando operações de envolvem a utilização de recursos escassos e que estão sujeitos a contenção, devemos utilizar esses recursos o mais tarde possível e em seguida, liberar esses recursos o mais rápido possível. Quanto menor a quantidade de tempo que um processo fica utilizando esse tipo de recurso escasso, mais cedo esse recurso estará disponível para outro processo utiliza-lo.


Projete para a comutabilidade – (Design for Commutability)

Desenhar a nossa aplicação para comutabilidade é sem sombra de dúvidas a maneira mais negligente para diminuir a contenção de recursos. Por exemplo: Quando temos duas operações podemos chamá-las de comutativa quando elas podem ser aplicadas em qualquer ordem e ainda sim ter o mesmo resultado final.


Projete para a intercambialidade – (Desigin for interchangeability)

Sempre que generalizamos um recurso estamos tornando o recurso intercambiável, e toda vez que adicionamos um estado detalhado de um recurso, estamos tornando esse recurso menos intercambiável.
Existem grupamentos de recursos que conseguem tirar proveito dos recursos intercambiáveis, tais como:

•COM+
•ODBC

Exigir componentes para manter o estado entre chamadas de métodos destrói toda a permutabilidade e a escalabilidade é impactada de forma negativa. Cada chamada de método deve ser autosuficiente e armazenar o estado fora do componente.


Recursos de partição e atividades – (Partition resources and activities)

Devemos particionar os recursos e as atividades, assim minimizando essas relações entre esses dois itens nós minimizamos o risco de criarmos gargalos.
Quando realizamos o particionamento das atividades aliviamos a carga que inserimos sobre um determinado recurso de alto custo. Quando utilizamos SSL é sensato utiliza-lo somente para as páginas que realmente precisam de uma maior segurança.
Porém tome muito cuidado porque o particionamento nem sempre é a melhor escolha, isso pode tornar o sistema mais complexo, dividindo recursos que exigem dependências pode adicionar uma grande sobrecarga para uma operação.


Boas práticas de escalabilidade

Como todo assunto em desenvolvimento de software nós temos as boas e as más práticas quando estamos desenvolvendo uma aplicação. Pensando em escalabilidade, abaixo são apresentados itens que são considerado como boas práticas. Elas não seguem uma ordem, porém são recomendadas quando estamos tentando atingir o máximo de uma aplicação escalável.

• Use tecnologias de clustering
• Considere camadas lógicas contra camadas físicas
• Isole métodos transacionais
• Elimine o estado da camada de negócios quando possível
•Reveja as melhores práticas para performance


Referências:

High Scalability
Google Cloud Plataform
Gostou do artigo e quer saber mais sobre tecnologia? Então siga os nossos perfis no Facebook, Twitter e LinkedIn !