Entendendo o que é escalabilidade

Entendendo o que é escalabilidade

Fala galera tudo bem?

O assunto de hoje vai ser algo mais teórico onde não vamos ver nenhuma linha de código, porém é um assunto bem interessante e que sempre causa dúvidas em alguns desenvolvedores, vamos entender o que é escalabilidade tanto horizontal quanto vertical, principais conceitos e boas práticas sobre esse assunto.

O que é escalabilidade?

Escalabilidade é a capacidade que um sistema tem de processos para trabalhar com uma quantidade elevada de processos ou o potencial para elevar a largura de processamento a fim de acomodar tranquilamente 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 designe da aplicação, por que isso não é uma característica que podemos adicionar em nossa aplicação mais tarde, as decisões que tomamos durante a codificação, fases iniciais, grande parte disso dita a escalabilidade da nossa aplicação.

Escalabilidade de aplicações requer um balanço entre o relacionamento de parceria de dois domínios distintos. Por exemplo, a construção de uma farm com servidores de load-alance não vai beneficiar uma aplicação que foi desenhada para ser executada em uma única maquina.

Quando abordamos o assunto de escalabilidade vamos além das aplicações tradicionais cliente-server 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 desenho de uma arquitetura escalável que compartilha 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 em uma versão ampliada do sistema abaixo temos uma imagem que ilustra a escalabilidade vertical.

Escalabilidade vertical – (Scalling-up)

Escalabilidade vertical – (Scalling-up)

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.

A 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.

Escalabilidade horizontal – (Scalling-out)

Escalabilidade horizontal – (Scalling-out)

 

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 design é 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

Pirâmide da escalabilidade

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, 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 designe para escalabilidade

Devemos levar em consideração esses 5 mandamentos, quando estamos desenhando uma aplicação escalável

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)

Quando desenhamos 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 chama-las de comutativa, quando elas podem ser aplicadas em qualquer ordem e ainda sim ter o mesmo resultado final.

Projete para a intercambialidade – (Degin 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 autossuficiente e armazenar o estado fora do componente.

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

Devemos particionar os recursos e as atividades, 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, vou comentar sobre 6 itens que é considerado como boas práticas.

Boas práticas

Essas boas práticas não seguem uma ordem, porém são recomendadas quando estamos tentando atingir o máximo de uma aplicação escalável.

Referências

Comentários

  1. […] aqui um item primordial, Escalabilidade horizontal. À medida que o número de clientes aumenta, são adicionados novos servidores para permitir que […]