Quando começar a pensar em escalabilidade? [fechadas]

10

Estou tendo um problema engraçado, mas também terrível. Estou prestes a lançar um novo aplicativo (iPhone). É um jogo multiplayer baseado em turnos, rodando em meu próprio back-end personalizado. Mas tenho medo de lançar.

Por alguma razão, acho que pode se tornar algo grande e que sua popularidade matará meu pobre servidor solitário e banco de dados MySQL.

Por um lado, estou pensando que, se estiver crescendo, é melhor eu estar preparado e ter uma infraestrutura escalável já em funcionamento.

Por outro lado, sinto vontade de divulgá-lo ao mundo e ver o que acontece.

Costumo ler coisas como "otimização prematura é a raiz de todo mal" ou pessoas dizendo que você deve apenas criar seu jogo assassino agora, com as ferramentas disponíveis, e me preocupar com outras coisas, como escalabilidade posteriormente.

Eu adoraria ouvir algumas opiniões sobre isso de especialistas ou pessoas com experiência nisso. Obrigado!

Rits
fonte
1
Parece que todo mundo perde a primeira parte da citação: "Devemos esquecer sobre pequenas eficiências, digamos cerca de 97% do tempo" ... pequenas eficiências + 97%
Guy Sirton
Deixe que isso se torne um problema, não conserte se não estiver quebrado. Vi dezenas de projetos em que as pessoas estavam penduradas em questões de escalabilidade. Adivinha o que aconteceu? Muitos dos projetos nunca conseguiram sair da porta.
CodeART 23/04
"digamos cerca de 97% do tempo" soa como uma otimização prematura do processo de otimização. ;) </kidding>
Rob

Respostas:

22

Na verdade, é uma escolha bastante fácil.

No momento, você tem zero usuários e a escalabilidade não é um problema.

Idealmente, você deseja atingir o ponto em que possui milhões de usuários e a escalabilidade se torna um problema.

No momento, você não tem um problema de escalabilidade; você tem um problema de número de usuários. Se você trabalhar no problema de escalabilidade, não solucionará o problema do número de usuários, o que significa que você terá resolvido um problema que ainda não possui e não terá resolvido o problema que possui. O resultado mais provável é que seu produto não funcione e todo o seu trabalho será por nada.

Se você trabalhar no problema número-de-usuários, você vai resolver um problema que você tem agora e , em seguida, você pode se concentrar na próxima problema, que pode ser escalabilidade.

O bom dos problemas de escalabilidade é que, por definição, tê-los geralmente significa que os negócios são muito bons e, por sua vez, isso significa que você pode gastar dinheiro na otimização da escalabilidade. Você não passa de zero usuário para dez milhões da noite para o dia e, se ficar de olho no desempenho do sistema, terá tempo de sobra para otimizar quando chegar a hora.

É claro que ajuda a manter a escalabilidade em mente ao escrever o código que você precisa no momento, mas não faz muito sentido gastar dezenas ou mesmo centenas de horas-homem em um recurso do qual você não sabe se será necessário, e o cenário mais provável é que você não precise. No momento, sua principal preocupação é enviar. O que acontece depois disso; bem, você pode se preocupar com isso mais tarde.

tdammers
fonte
6

Não há motivo para otimizar até que você saiba que a otimização é necessária. Como você sabe que a otimização é necessária? Você mede.

Supondo que seu servidor tenha algum tipo de interface baseada na Web, você pode simular muitos usuários usando ferramentas como o Apache JMeter . Aprenda a usar a ferramenta e comece a testar o seu back-end. Você deve aprender o suficiente para saber quais são os limites para o seu sistema. Em seguida, você pode combinar essas informações com o número de usuários que você possui e o número médio em execução ao mesmo tempo, para decidir quando aumentar a escala.

Bryan Oakley
fonte
6

TL; DR Você deve pensar em escalabilidade antes de escrever a primeira linha de código.

Primeiras coisas primeiro. Scalabilty! = Otimização

Você deve pensar em escalabilidade antes de escrever a primeira linha de código. Isso não significa que você construa uma infraestrutura maciça com a chance de seu jogo ser um sucesso. Pensar em escalabilidade significa:

  • Certificando-se de que o código seja escrito para que ele seja dimensionado. Eu já vi muitos projetos em que não se pensou na necessidade de escalar. Os resultados são uma base de código que não será dimensionada, independentemente do hardware que você utiliza, ou é proibitivamente cara.
  • Descubra sua estratégia de dimensionamento. Tenha um plano sobre como dar suporte a todos os usuários. Você tem um banco de dados MySQL, vai fragmentá-lo ou agrupar, ou algo mais. Estratégias como sharding requerem um pouco de reflexão, porque impõem requisitos à arquitetura. Clustering, menos ainda. Você está apoiando sessões e como as sessões reagirão com vários servidores front-end. Você precisará de sessões fixas, no seu balanceador de carga.
  • Descobrir a estratégia de implementação. Você vai usar a AWS para dimensionar. Você pode alavancar quaisquer produtos ou serviços que oferecem escalonamento dinâmico imediato? Isso também envolve entender seus custos.

MAS parece que você já tem uma base de código. A questão agora é quando começar a dimensionar. Isso depende completamente do seu código.

Se o seu código se presta ao dimensionamento , você tem a parte mais difícil. Você pode obter uma conta da AWS, ativar servidores conforme necessário e ir embora.

Se o seu código não for dimensionado ou tiver gargalos , você precisará trabalhar. Você precisa identificar quais são seus gargalos e corrigi-los. O "quando" é realmente difícil de saber. Alguns platôs de serviços, outros aumentam constantemente e outros explodem. Decidir quando jogar recursos em algo como escalar geralmente é uma função dos negócios e é uma avaliação dos riscos.

Na sua posição , posso lançar como "beta" e gerenciar as expectativas do usuário. Dessa forma, posso retirar o produto e ver como ele se desenrola.

dietbuddha
fonte
5
Este é um conselho terrível. Há o suficiente para pensar sempre que uma empresa é iniciada, a escalabilidade deve ser o último item. O principal precisa ser como obter rapidamente um feedback útil sobre as maneiras pelas quais o que você criou não é o que você precisa criar. O segundo deve ser sobre como não se pintar em um canto. No entanto, hoje em dia você pode facilmente fazer com que um site simples com base em banco de dados seja escalado para milhões de páginas dinâmicas por hora (eu deveria saber, eu já fiz). Preocupe-se com o fato de o banco de dados ser um gargalo antes que o primeiro usuário seja retrocedido.
btilly
Tentar fazer esse tipo de previsão orientada para o futuro praticamente significa que cada variável em cada classe não deve ser uma instância individual, mas uma coleção. (MasterServer se torna MasterServerCollection, Viewport se torna ViewportCollection armazenado em um ClientDevice, o SceneGraph de um servidor se torna WorldInstanceCollection) ... retrospectiva é 20-20. Se você souber de possíveis problemas muito à frente, poderá garantir que esses ajustes sejam fáceis de fazer. Alguns deles.
precisa saber é
1
Muito bom ponto. Primeiro grande projeto de contrato em que fui incluído, por algum motivo, pensei em escalabilidade, mesmo que não estivesse nos requisitos. Eu entreguei a tempo e não houve problema. Alguns anos depois, um colega me ligou para dizer como era incrível quando eles foram solicitados a escalar o sistema e as partes que eu havia criado foram escaladas com tanta facilidade! Mas isso foi anos depois, e apenas para me oferecer algum elogio.
Raybarg
3

Portanto, há duas vezes em que você deve pensar em escalabilidade.

Primeiro, ele deve ser cuidadosamente ponderado antes de você escrever uma única linha de código. Isso é para garantir que você não se escreva em um buraco de escalabilidade e para garantir que seu código esteja instrumentado para fornecer as medidas necessárias pela segunda vez.

A segunda vez em que se considera a escalabilidade é suficiente para que as coisas se tornem inaceitavelmente lentas. Isso significa que você precisa saber o que significa "muito lento" e como sua coisa reage sob carga. Se você tiver um serviço cujo driver (provavelmente qps) aumente em N% ao mês, terá tempos bastante diferentes de "95% dos recursos da máquina consumidos" se o uso de recursos for quadrado da carga ou linear.

Com um jogo baseado em turnos, você deve ter uma margem de segurança decente (provavelmente não está tendo um único mundo de jogo e, se o fizer, provavelmente existe uma geometria interna, o que significa que você não tem "todo mundo interage com todo mundo"). transformar "problemas).

Sem saber detalhes, levaria um ou dois dias para pensar sobre onde você tem problemas de dimensionamento e quais estratégias possíveis você tem para resolvê-los. Mas, isso é importante, pense. Não faça, apenas pense (e documente). A menos que você tenha problemas de escalabilidade que começam a se manifestar em algumas centenas de usuários, você deve ter tempo para verificar a carga e aumentar mais recursos de back-end.

Vatine
fonte
2

Na sua descrição, parece que existem dois resultados possíveis:

  • O jogo é um fracasso e então você não se importa.
  • O jogo foi bem-sucedido e seu back-end não será capaz de lidar com a carga e o resultado seria um fracasso.

Hummm.

Aqui estão algumas perguntas para se perguntar:

  • Quantos usuários seu back-end atual pode lidar com desempenho aceitável?
  • Você tem algum tipo de plano para limitar o impacto para os usuários atuais se estiver vendo algum tipo de crescimento rápido (por exemplo, retire temporariamente o jogo da loja de aplicativos)
  • Com que rapidez você pode criar um back-end melhor se tiver êxito?
  • Quais são as implicações comerciais da espera. Você pode se alimentar? Quais são os riscos?
  • Quais são as implicações comerciais da liberação agora, dadas as respostas para a pergunta acima.

A resposta à sua pergunta deve ficar evidente quando você as considerar. Nenhum especialista pode dizer o que fazer sem mais informações, pois todos os sistemas são diferentes e todos os negócios são diferentes.

Guy Sirton
fonte
1

Seu servidor será usado interativamente pelos usuários. Isso significa que a latência está afetando a experiência do usuário de uma maneira muito profunda. Uma latência ruim sempre resulta em uma experiência ruim do usuário.

Pelo menos faça alguns testes de carga ad-hoc, conforme descrito por Bryan.


Uma abordagem mais séria

Faça algumas simulações e descubra o que a latência faz com a sua experiência do usuário (usando uma simulação de atraso de rede ou apenas dormir () dentro do seu aplicativo). Descubra em que latência está ficando perceptível, irritante e inutilizável.

Em seguida, vem o primeiro passo na direção da otimização. Escolha um SLA para o servidor: por exemplo, na pior das hipóteses, 10% de chamadas com latência irritante e 1% de chamadas com latência inutilizável. Com esses limites, você pode usar o teste de carga para descobrir quantos usuários seu servidor pode suportar.

O teste de taxa de transferência pura sem medir a latência (ou pelo menos manualmente usando o servidor durante o teste de carga) não é tão útil porque não informa se os números de taxa de transferência medidos resultam em uma experiência suportável do usuário.

Uma apresentação muito agradável sobre a medição da latência por Gil Tene: http://www.infoq.com/presentations/latency-pitfalls

Patrick
fonte
1

No estágio de requisitos de negócios, que é usado para estabelecer um entendimento comum de desempenho para todos os elementos a jusante, como arquitetura, operações, desenvolvimento, controle de qualidade e monitoramento no prod. Se você não estabelecer um entendimento comum sobre o que é necessário desde o início, cada uma das partes da organização fará suposições sobre o desempenho (ou nem sequer pensará nelas) ao se envolver em tarefas específicas ao longo do ciclo de vida da organização. inscrição. Isso é verdade se você está envolvido em cascata, cascata curta, ágil ou qualquer que seja a metodologia de desenvolvimento do momento na lista de palavras-chave do currículo.

Desempenho e escalabilidade são difíceis. Funcionalidade é fácil. O código de escala insuficiente aumentará para preencher qualquer pool de recursos que você fornecer, portanto, mudar a bolha de custos comprando hardware maior leva apenas muito antes de você precisar corrigir o código ineficiente ou adquirir cada vez mais hardware. Deixar isso durar em prioridade também é muito caro. Existem decisões de arquitetura e design que são tomadas no início do ciclo de vida do aplicativo que podem precisar ser completamente revertidas para atender a um requisito de chegada tardia relacionado ao desempenho - pense em um fabricante de carros esportivos de alto desempenho que precise mudar do alumínio para o alumínio fibra de carbono no final do ciclo de design para atingir uma relação potência / peso relacionada ao desempenho e como isso afeta as ferramentas, o treinamento, a construção do carro, etc.

Pergunte aos arquitetos, desenvolvedores e pessoas da operação da sua organização quais são os requisitos de desempenho para o aplicativo. Se elas não forem capturadas da empresa, não se surpreenda se você receber respostas diferentes (ou nenhuma resposta) de pessoas diferentes, mesmo dentro do mesmo grupo. Essas "suposições" sempre voltam para atacar a organização na implantação.

James Pulley
fonte
"Pergunte aos arquitetos, desenvolvedores e pessoas das operações da sua organização ..." - Nada na pergunta indica que isso seja para uma organização, é apenas o projeto paralelo desse cara.
Graham