Estouinclinadoacomeçardizendo"Escolha dois".
Essa variante do triângulo de ferro diz basicamente que você não pode ter todos os três. Se assumirmos que você quer bom (desempenho, confiabilidade), rápido (implantação simples) e barato (encargos e manutenção de provedores de serviço) ... seu melhor caso pode ser uma proposição de duas em três para as quais há poucas balas mágicas .
Estou inclinado a discordar da premissa de que a abordagem da CDN não seria suficientemente rápida, uma vez que um objeto não precisa ser insanamente popular para ser suficientemente popular, e a breve espera ocasional por uma minoria dos objetos em uma página bem projetada pode passar despercebida. Um CDN como o CloudFront tem a vantagem adicional de que suas solicitações ao servidor de origem percorrem a rede da Amazon de maneira significativa, em vez da Internet pública, removendo algumas das variáveis do transporte de dados global.Mas há uma abordagem híbrida combinando essencialmente todos os elementos que você mencionou:
A linha de frente é o CDN. Diremos o CloudFront, que usa o DNS para rotear automaticamente as solicitações dos navegadores para o local de ponta mais ideal.
O servidor de origem ao qual o CDN se conecta na parte de trás é, na verdade, vários servidores, geo / latência roteados usando o Route 53, de modo que a borda CDN se conecta ao servidor de origem mais próximo, em uma região próxima da AWS.
Esses destinos roteados por geo / latência - as origens em que o CDN atualiza objetos não armazenados em cache - são instâncias do EC2, mas em vez de servidores da Web completos, eles executam proxies, um ou mais em cada região , com o S3 como back-end de armazenamento em vez de discos rígidos. Como os proxies podem reescrever os cabeçalhos do host original no caminho para o S3, os nomes dos seus buckets não precisam mais corresponder, então você pode colocar um em cada região. Você pode obter uma taxa de transferência substancial em instâncias muito pequenas com um proxy como o HAProxy (tenho máquinas t2.micro que atendem a 2 milhões de solicitações por dia, mantendo uma utilização constante da CPU em torno de 3%). Como os proxies estão na mesma região dos buckets, não há taxas de transferência de dados. Você não precisa de ELB, porque as verificações de integridade do Route 53 podem remover um proxy não funcional do pool do qual o CDN selecionará. Se, por algum motivo, o bucket do S3 ficar inacessível ao proxy, o proxy falhará deliberadamente na verificação de integridade, fazendo com que ele seja removido da seleção.
Se você quisesse ter porcas absolutamente inferiores a milissegundos, você poderia usar o Varnish como proxy nas máquinas do EC2 e armazenar em cache o conteúdo do S3 dentro do EC2, então você provavelmente já o teria se o CDN precisasse de uma nova cópia. / p>
Assim, o navegador seleciona a borda CDN mais próxima, o CDN seleciona o backend mais próximo, que é um proxy (um dos potencialmente vários por região) que possui um caminho de baixa latência para qualquer conteúdo que ainda não esteja contido no CDN. armazenado em um balde na mesma região.
Altamente disponível, tolerante a falhas, extremamente responsiva em nível global, construída a partir de componentes padrão, interconectados de maneira um pouco criativa. (É assim que eu faço.)