O que torna um aplicativo escalonável?

Sempre vejo em anúncios de emprego que o candidato deve ter experiência na redação de candidaturas “escalonáveis”. O que torna um aplicativo escalonável e como sei que meu código pode ser escalado para milhões de usuários?


Acho que uma maneira melhor de formular essa pergunta é: Como posso escrever meu código com escalabilidade em mente? Para que o código seja escalonável desde o início, ao contrário de uma reflexão tardia. Existem certas metodologias de design? Ou é simplesmente uma questão de escolher os algoritmos corretos para o trabalho?

Resposta

Existem duas direções de escalabilidade:

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

Para o primeiro, você apenas tem que tomar cuidado para não ter nenhuma limitação arbitrária. Isso é devido a tamanhos inteiros muito pequenos ou estruturas de comprimento fixo / limitado. Essas estruturas podem estar relacionadas ao sistema operacional subjacente. Por exemplo, se você tentar escalar usando mais threads ou processos, em algum momento você atingirá os limites do SO. É por isso que atualmente os servidores construídos para alta escalabilidade estão fazendo concorrência com base em eventos assíncronos. Este problema é descrito no famoso C10K documento .

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ído. 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 ACID completo e capacidade de escalabilidade horizontal ao mesmo tempo). A solução mais conhecida para dados armazenamento nesse paradigma são soluções NoSQL . Elas variam de armazenamentos de valores-chave muito simples a sistemas semelhantes a RDBMS, apenas privados da capacidade de fazer junções. div id = “73fab16cf2”>

armazenamentos de valores-chave são ultraescaláveis, mas isso vem como um preço. Você pode consultar apenas a chave primária. No entanto, há uma solução para que, “s mapa reduzido . Pode parecer muito abaixo do ideal se você olhar do ponto de vista da complexidade cumulativa, mas você deve ter em mente que está funcionando enormemente em paralelo.

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

Comentários

  • +1 para mencionar o scale out. Adicionar mais recursos é muito rápido e atraente para os tomadores de decisão (compre alguns hex-cores e duplique a memória! ). Mas se o aplicativo puder ‘ colocar pressão sobre eles, você terá um problema maior.

Resposta

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 conforme a carga aumenta.

A primeira coisa que você precisa entender ao projetar para escalabilidade é qual medição é mais importante para sua aplicação? Existem várias maneiras de medir a eficiência , que é um componente-chave 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 mais medidas de 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 a sua eficiência conforme a carga aumenta. Formas comuns de aumento de carga são:

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

O objetivo de um aplicativo escalonável é para manter ou melhorar a eficiência à medida que lidamos com o problema de carga. Resumindo, se o tempo de resposta está demorando muito, podemos adicionar outro servidor para distribuir a carga uniformemente? Esta abordagem reduz a quantidade de trabalho para um servidor fazer e mantém os servidores operando naquele “ponto ideal” para eficiência.

Seu aplicativo precisará ser projetado especificamente para escalar. Isso significa que você tem que ter cuidado com os dados da sessão, roteando as solicitações para o servidor certo, reduzindo os gargalos que limitam a capacidade de escala do aplicativo.

Resposta

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ê dá uma olhada no seu esquema de banco de dados, seus algoritmos e seu 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çam a se acumular.

Peguei essas dicas quando li Criando sites escaláveis (link para o amazon).

Espero que ajude!

Resposta

A única maneira que os aplicativos pode ser verdadeiramente escalável, é por não ter nenhuma restrição que não possa ser passada (ou apenas muito cara).

Um exemplo típico é o que acontece quando você fica sem ciclos de CPU disponíveis? Se o seu programa for multi-banda, você pode rodar em uma caixa com múltiplos 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 é escalonável.

Qualquer aplicativo verdadeiramente escalonável deve ser capaz de se espalhar por vários computadores de forma transparente e sem solavancos perceptíveis. Isso não é fácil e é um dos motivos do sucesso do Google.

Resposta

Existem problemas únicos que vêm com suporte a aplicativos em grande escala. O anúncio de emprego está procurando candidatos que já trabalharam naquele ambiente e tiveram que resolver esses problemas.

A partir de um aplicativo de alto nível, os “s são escalonáveis, perguntando-se constantemente o que aconteceria se esse trecho de código fosse executado milhares de vezes em um período muito pequeno. Isso significa gerenciar suas pegadas de memória , fazendo uso de cache de totais e dados, usando fontes de dados que são escalonáveis, etc.

Resposta

Se você fosse construir um recurso de pesquisa com bom desempenho quando tem 100 linhas no banco de dados para pesquisar e 10 usuários usando ao mesmo tempo. Qual seria o desempenho dele se 100 usuários estivessem usando ao mesmo tempo e houvesse 100 mil linhas para pesquisar.

Se tiver o mesmo desempenho, não importa o que aconteça, é muito bom. Ele tem um desempenho proporcional à quantidade de usuários / dados (o que significa 10x mais dados == 10x mais tempo para processar), isso é bom. Se tiver muito desempenho menor quanto mais dados ele tiver (dados de modo 10x == 10x ^ 10 mais tempo para processar), então ele não escalará bem.

Meus exemplos realmente deveriam ser mostrados em notação Big O, mas eu cu atualmente não o conheço bem o suficiente para escrever os exemplos em Big O.

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *