ti-enxame.com

O que devo fazer para expandir um site de alto tráfego?

Quais práticas recomendadas devem ser adotadas para um site que precisa ser "escalonado" para lidar com a capacidade? Isso é especialmente relevante agora que as pessoas estão considerando a nuvem, mas podem estar perdendo os fundamentos.

Estou interessado em ouvir sobre qualquer coisa que você considere uma prática recomendada, desde tarefas em nível de desenvolvimento até infraestrutura e gerenciamento.

14
goodguys_activate

Design para simultaneidade

Ou seja, enquanto você codifica, planeje ter vários threads em funcionamento. Planeje o estado compartilhado (geralmente apenas o banco de dados). Planeje vários processos. Planeje a distribuição física.

Isso permite que você distribua seu sistema em várias máquinas e em vários processos com balanceamento de carga. Ele permite que você execute processos redundantes em caso de falha e, caso precise modificar o sistema no local, não é necessário interromper todos os serviços para fazê-lo.

16
Fishtoaster

Algumas coisas que você pode considerar:

  • Separando os lados de leitura e gravação do seu armazenamento de dados.
    • CQRS/Fonte de Eventos
    • CQS
    • Passagem de mensagem/Atores
  • Evitando processo compartilhado e estado do encadeamento
    • Portanto, evitando o bloqueio
    • Você pode evitar isso através do sistema de tipos, criando suas classes, estruturas e outros tipos de dados para serem imutáveis, ou seja, sem alterações após a construção. Especialmente para tipos de dados abstratos complexos, ele funciona surpreendentemente bem (por exemplo, a implementação do jQuery)
  • Não está bloqueando os encadeamentos do servidor da Web no IO. Se você estiver usando o ASP.Net, use páginas/ações assíncronas com o padrão APM/TPL (Biblioteca Paralela de Tarefas)
  • Não salvando cargas de estado no dicionário da sessão do usuário
    • Isso deve ser movido pelos threads quando ocorrem migrações de threads no IIS.
    • Possuir roteamento inteligente, para que recursos estáticos/não protegidos não sejam atendidos com a mesma estrutura de aplicativo (por exemplo, ASP.Net) que adiciona sobrecarga. Veja como ter servidores da web diferentes, por exemplo.
  • Gravando código de passagem de continuação com um padrão de fluxo de trabalho assíncrono (por exemplo, bind (haskell) /callcc/Tasks.ContinueWith/F#'s async)
  • Use a teoria das filas para calcular onde seus gargalos podem ocorrer
  • Use as atualizações push em vez de pull para modelos de leitura e outro estado do aplicativo. Por exemplo. através do RabbitMQ/nServiceBus
  • Use o 'manipulador http' com menos recursos
  • Para arquivos estáticos, atenda a tags eletrônicas e políticas de expiração de cache para permitir que a infraestrutura da Web funcione como deveria (por exemplo, com o squid proxy)
  • (Contrate-me para resolver seus problemas de dimensionamento e obter tutoriais no local;))
13
Henrik

Compartilhar arquitetura nada

Com isso em mente, e ao contrário do que você imagina, não pule imediatamente para uma solução em expansão. A sobrecarga fora do sistema vs. uma chamada no sistema não deve ser sub-ponderada. Por exemplo, leva muito mais tempo para estabelecer uma conexão com o banco de dados em qualquer interface de rede do que para fazer uma chamada local. Orçar quanto tempo em gerenciamento, energia e esforço de ajuste é necessário na expansão em relação aos US $ extras para um verdadeiro sistema grande.

Independentemente disso, ainda há um grande valor nas arquiteturas de "não compartilhar nada" e você pode colocar em camadas e dimensionar seus sistemas quando chegar a hora.

4
Jé Queue

DNS seguro, rápido e confiável

Encontrei alguns sites de alta capacidade usando o servidor DNS do registrador, que não possuía SLA para tempo de atividade ou desempenho. Além disso, seus servidores estavam localizados na Índia e apenas a latência aumenta a chance de um O spoofer de DNS pode envenenar o cache do seu cliente ou o ISP intermediário, o que faria com que até o tráfego protegido por SSL fosse redirecionado sem que ninguém soubesse.

A velocidade do DNS também afeta o tempo de carregamento inicial do seu servidor, antes que os registros sejam armazenados em cache.

Eu uso o DynDNS ou o Neustar para a maioria dos meus clientes, pois eles têm uma infra-estrutura DNS bastante sólida (embora seja caro e eu não tenha outra afiliação a essas empresas).

0
goodguys_activate

Paralelize solicitações em vários nomes de host

Parte do padrão HTTP é uma seção que diz que os clientes solicitam no máximo 2 sessões por host DNS. Aqui está uma solução em que você e seu alias acessam seu www.domain.com e obtêm uma maior concorrência de solicitações, tornando sua página carregada mais rapidamente:

https://stackoverflow.com/questions/3653609/how-do-i-code-my-asp-net-page-to-parallelize-downloads-across-hostnames

Basicamente, envolve editar o manipulador HTTP do ASP.NET para alternar os hosts de destino para os quais você envia clientes, onde cada host é um CNAME para "www".

0
goodguys_activate

Eu acho que a chave será simples:

Tenha um código simples. Isso significa algo que você olha e entende. À medida que você expande e altera os servidores, precisa saber o que está acontecendo. Você também pode precisar adicionar codificadores que precisam entender rapidamente. Ganchos e arquivos XML que chamam código aleatório que não é óbvio são muito ruins.

Então você pode testar e encontrar os problemas.

Veja aqui: http://blog.servint.net/2013/08/27/going-big-how-to-scale-a-website-part-1-infrastructure-that-scales/

Em stellarbuild tentamos garantir que nossos sites sejam dimensionados sem tempo ocioso. Isso significa que você precisa saber o que seu código faz e onde ele o faz. Mesmo se você estiver testando uma máquina diferente, não poderá demorar muito para dimensionar. A maioria das pessoas só começa quando é quase tarde demais, infelizmente. Você pode otimizar apenas quando fizer isso na minha opinião.

0
msj121