O que torna um aplicativo escalável?

37

Continuo vendo em anúncios de emprego que o candidato deve ter experiência em escrever aplicativos "escalonáveis". O que torna um aplicativo escalável e como sei que meu código pode ser escalado para milhões de usuários?


Eu acho que uma maneira melhor de formular esta pergunta é: Como posso escrever meu código com escalabilidade em mente? Para que o código seja escalável desde o início, em oposição a uma reflexão tardia. Existem certas metodologias de design? Ou é simplesmente uma questão de escolher os algoritmos corretos para o trabalho?

jnevelson
fonte

Respostas:

24

Existem duas direções de escalabilidade:

  • vertical (também conhecido como ampliação): CPU mais rápida, mais RAM, mais espaço em disco;
  • horizontal (também conhecido como redimensionamento): mais núcleos na CPU, mais CPUs, mais servidores;

Para o primeiro, você apenas precisa tomar cuidado para não ter limitações arbitrárias. Estes são por causa de tamanhos inteiros muito pequenos ou estruturas de comprimento fixo / limitado. Essas estruturas podem estar relacionadas ao SO subjacente. Por exemplo, se você tentar ampliar usando mais threads ou processos, em algum momento atingirá os limites do sistema operacional. É por isso que atualmente os servidores criados para alta escalabilidade estão fazendo simultaneidade com base em eventos assíncronos. Esse problema é descrito no famoso documento C10K .

O segundo é mais difícil. Requer programação com duas coisas em mente: os dados serão processados ​​em paralelo e os dados podem ser fisicamente distribuídos. A comunicação entre os nós deve ser limitada. Na prática, isso geralmente significa sacrificar algumas partes do ACID (está provado que você não pode ter o ACID completo e a capacidade de expandir ao mesmo tempo). A solução mais conhecida para armazenamento de dados nesse paradigma são as soluções NoSQL . Eles variam de armazenamentos de valores-chave muito simples, a sistemas como o RDBMS, apenas sem capacidade de fazer junções. As lojas de valores-chave são ultra escaláveis, mas isso tem um preço. Basicamente, você pode consultar apenas a chave primária. No entanto, existe uma solução para isso, é o mapa reduzir. Pode parecer muito abaixo do ideal se você observar o ponto de vista da complexidade cumulativa, mas tenha em mente que ele está sendo executado em paralelo.

Se você quiser ler mais sobre escalabilidade com exemplos da vida real, consulte o blog HighScalability.com .

vartec
fonte
+1 por mencionar a expansão. A adição de mais recursos é muito rápida e atraente para os tomadores de decisão (compre alguns núcleos hexagonais e dobre a memória!). Mas se o aplicativo não puder exercer pressão sobre eles, você terá um problema maior.
JQA
14

A escalabilidade é medida em termos de taxa de transferência com base em alguma variável. Por exemplo, número de solicitações / segundo com usuários X. A maneira mais simples de descrever a escalabilidade é:

Uma medida de eficiência à medida que a carga aumenta.

A primeira coisa que você precisa entender ao projetar para escalabilidade é qual medida é mais importante para seu aplicativo? Existem várias maneiras de medir a eficiência, que é um componente essencial da escalabilidade:

  • Solicitações simultâneas por segundo
  • Tempo médio de resposta por solicitação
  • Número de registros processados ​​por segundo / minuto

Existem medições de mais eficiência que podem ser usadas, mas são comuns para sistemas baseados na Web ou sistemas de processamento em lote.

O próximo aspecto da escalabilidade é medir o que acontece com sua eficiência à medida que a carga aumenta. As formas comuns de aumentar a carga são:

  • Mais usuários acessando o servidor (ou seja, mais tráfego na web)
  • Mais dados no banco de dados (ou seja, as consultas demoram mais ou o processamento demora mais)
  • Falha no disco rígido em um RAID (o desempenho / confiabilidade do armazenamento é afetado)
  • Saturação da rede

O objetivo de um aplicativo escalável é manter ou melhorar a eficiência à medida que lidamos com o problema de carga. Em resumo, se o tempo de resposta estiver demorando muito, podemos adicionar outro servidor para distribuir a carga uniformemente? Essa abordagem reduz a quantidade de trabalho de um servidor e mantém os servidores operando nesse "ponto ideal" para obter eficiência.

Sua aplicação precisará ser projetada especificamente para ser dimensionada. Isso significa que você deve ter cuidado com os dados da sessão, encaminhando solicitações para o servidor certo, reduzindo os gargalos que limitam a capacidade de dimensionamento do aplicativo.

Berin Loritsch
fonte
5

Basicamente, você deseja evitar gargalos de desempenho ao aumentar o número de usuários e / ou processar um conjunto de dados maior e / ou oferecer sua interface em mais idiomas, etc.

Basicamente, você analisa o esquema do banco de dados, os algoritmos e o processo de desenvolvimento de software e tenta prever problemas futuros. Você também deseja configurar o monitoramento de desempenho para identificar problemas quando eles começarem a construir.

Peguei essas dicas ao ler Construindo sites escaláveis (link para amazon).

Espero que isto ajude!

louisgab
fonte
3

A única maneira de os aplicativos serem verdadeiramente escalonáveis ​​é não ter restrições que não possam ser aprovadas (ou apenas muito caras).

Um exemplo típico é o que acontece quando você fica sem os ciclos da CPU disponíveis? Se o seu programa é multi-rodado, você pode executar em uma caixa com vários núcleos, mas o que acontece quando você não pode mais comprar uma caixa maior? Seu aplicativo simplesmente não pode mais crescer e, portanto, não é escalável.

Qualquer aplicativo verdadeiramente escalável deve poder se espalhar por vários computadores de maneira transparente e fazê-lo sem inchaços perceptíveis. Isso não é fácil e é uma das razões pelas quais o Google tem sido tão bem-sucedido.


fonte
1

Existem problemas exclusivos que acompanham o suporte a grandes aplicativos em escala. O anúncio de emprego procura candidatos que trabalharam nesse ambiente e tiveram que resolver esses problemas.

A partir de um aplicativo de alto nível, a escalabilidade é feita constantemente, perguntando-se o que aconteceria se fosse solicitado que esse trecho de código fosse executado milhares de vezes em um período muito pequeno. Isso significa gerenciar suas pegadas de memória, fazer cache de totais e dados, usar fontes de dados escaláveis, etc.

jzd
fonte
1

Se você estava criando um recurso de pesquisa com bom desempenho quando ele possui 100 linhas no banco de dados para pesquisar e 10 usuários usando-o por vez. Qual seria o desempenho quando 100 usuários o estivessem usando ao mesmo tempo e há 100 mil linhas para procurar.

Se ele executa o mesmo, não importa o que, então é muito bom. se for proporcional à quantidade de usuários / dados (o que significa 10x mais dados == 10x mais tempo para processar), isso é bom. Se ele tiver um desempenho muito menor, mais dados possuir (dados no modo 10x == 10x ^ 10 mais tempo para processar), mas não será bem dimensionado.

Meus exemplos realmente devem ser mostrados na notação Big O, mas atualmente não o conheço o suficiente para escrever os exemplos em Big O.

Você pode simular mais dados despejando dados fictícios no seu banco de dados e existem ferramentas para simular mais usuários, como o Apache AB.

JD Isaacks
fonte