Por que o Facebook usou C ++ ao lado de PHP? [fechadas]

15

Qual é o principal motivo que levou o Facebook a usar o C ++ ao lado do PHP? Gostaria de saber se eu criar um site com muitos visitantes eu precisaria usar C ++ também?

Goma
fonte
Possivelmente para processos de back-end, mas você seria louco por desenvolver regularmente web.
precisa saber é o seguinte
1
A pergunta programmers.stackexchange.com/questions/53624/… também discute esse problema. Você pode dar uma olhada nisso.
Vitor Py
4
Por que o Google escreve seus servidores em C ++?
Job
1
@ Job e Java e Python.
rightfold
5
@WTP, que eu saiba, Python é usado para fins de prototipagem de novos recursos e testá-los. Quando a carga do usuário se torna alta e as coisas precisam funcionar o mais rápido possível, o código Python é substituído pelo código C ++. Tenho certeza de que uma diferença de velocidade tão pequena quanto 1,2 é um grande problema para servidores que enfrentam centenas de milhões de usuários.
Job

Respostas:

20

Eis o porquê: HipHop para PHP: Mova-se Rápido :

Um dos principais valores do Facebook é avançar rapidamente. Nos últimos seis anos, conseguimos realizar muito graças ao rápido ritmo de desenvolvimento que o PHP oferece. Como linguagem de programação, o PHP é simples. Simples de aprender, simples de escrever, simples de ler e simples de depurar. Podemos obter novos engenheiros no Facebook muito mais rapidamente com PHP do que com outras linguagens, o que nos permite inovar mais rapidamente.

Hoje, estou empolgado em compartilhar o projeto com uma pequena equipe de pessoas incríveis e tenho trabalhado nos últimos dois anos; HipHop para PHP. Com o HipHop, reduzimos o uso da CPU em nossos servidores da Web em média em cerca de cinquenta por cento, dependendo da página. Menos CPU significa menos servidores, o que significa menos sobrecarga. Este projeto teve um tremendo impacto no Facebook. Consideramos que a Web em geral pode se beneficiar do HipHop, por isso estamos lançando-a como código aberto esta noite, na esperança de que traga um novo foco para o dimensionamento de grandes sites complexos com PHP. Embora o HipHop tenha nos mostrado resultados incríveis, ele certamente não está completo e você deve se sentir confortável com o software beta antes de testá-lo.

O HipHop para PHP não é tecnicamente um compilador. Pelo contrário, é um transformador de código-fonte. O HipHop programaticamente transforma seu código-fonte PHP em C ++ altamente otimizado e, em seguida, usa g ++ para compilá-lo. O HipHop executa o código-fonte de maneira semanticamente equivalente e sacrifica alguns recursos raramente usados ​​- como eval () - em troca de um desempenho aprimorado. O HipHop inclui um transformador de código, uma reimplementação do sistema de tempo de execução do PHP e uma reescrita de muitas extensões PHP comuns para aproveitar essas otimizações de desempenho.

Escalando o PHP como uma linguagem de script

As raízes do PHP são as de uma linguagem de script, como Perl, Python e Ruby, todas com grandes benefícios em termos de produtividade do programador e capacidade de iterar rapidamente nos produtos. Isso é comparado a linguagens compiladas mais tradicionais como C ++ e linguagens interpretadas como Java. Por outro lado, as linguagens de script geralmente são menos eficientes no que diz respeito ao uso da CPU e da memória. Por causa disso, tem sido difícil escalar o Facebook para mais de 400 bilhões de visualizações de página baseadas em PHP todos os meses.

Uma maneira comum de resolver essas ineficiências é reescrever as partes mais complexas do seu aplicativo PHP diretamente no C ++ como extensões do PHP. Isso transforma amplamente o PHP em uma linguagem de cola entre o HTML do front-end e a lógica do aplicativo em C ++. Do ponto de vista técnico, isso funciona bem, mas reduz drasticamente o número de engenheiros que podem trabalhar em todo o aplicativo. Aprender C ++ é apenas o primeiro passo para escrever extensões PHP, o segundo é entender as APIs do Zend. Dado que nossa equipe de engenharia é relativamente pequena - existem mais de um milhão de usuários para cada engenheiro - não podemos permitir que partes de nossa base de código sejam menos acessíveis que outras.

Escalar o Facebook é particularmente desafiador, porque quase todas as visualizações de páginas são um usuário logado com uma experiência personalizada. Quando você visualiza sua página inicial, precisamos procurar todos os seus amigos, consultar as atualizações mais relevantes (de um serviço personalizado que criamos chamado Multifeed), filtrar os resultados com base em suas configurações de privacidade e preencher as histórias com comentários , fotos, curtidas e todos os dados valiosos que as pessoas adoram no Facebook. Tudo isso em menos de um segundo. O HipHop nos permite escrever a lógica que realiza a montagem da página final em PHP e iterá-la rapidamente, contando com serviços de back-end personalizados em C ++, Erlang, Java ou Python para atender ao Feed de Notícias, pesquisa, Chat e outras partes principais do site.

Desde 2007, pensamos em algumas maneiras diferentes de resolver esses problemas e até tentamos implementar algumas delas. A sugestão comum é reescrever o Facebook em outro idioma, mas, dada a complexidade e a velocidade de desenvolvimento do site, isso levaria algum tempo para ser realizado. Reescrevemos aspectos do Zend Engine - internos do PHP - e contribuímos com esses patches de volta ao projeto PHP, mas, no final das contas, não vimos o tipo de aumento de desempenho necessário. Os benefícios do HipHop são quase transparentes à nossa velocidade de desenvolvimento.

Hacking Up HipHop

Uma noite em um Hackathon há alguns anos (veja Prime Time Hack), iniciei meu primeiro pedaço de código transformando PHP em C ++. As linguagens são bastante sintáticas e o C ++ supera drasticamente o PHP no que diz respeito ao uso da CPU e da memória. Até o próprio PHP é escrito em C. Sabíamos que era impossível reescrever com êxito uma base de código inteira desse tamanho manualmente, mas imaginávamos o que aconteceria se construíssemos um sistema para fazê-lo programaticamente.

Encontrar novas maneiras de melhorar o desempenho do PHP não é um conceito novo. No tempo de execução, o Zend Engine transforma sua fonte PHP em códigos de operação, que são executados na Zend Virtual Machine. Projetos de código aberto, como APC e eAccelerator, armazenam em cache essa saída e são usados ​​pela maioria dos sites com PHP. Há também o Zend Server, um produto comercial que torna o PHP mais rápido via otimização e cache de opcode. Em vez disso, estávamos pensando em transformar a fonte PHP diretamente em C ++, que pode ser transformada em código de máquina nativo. Mesmo compilar o PHP não é uma idéia nova, projetos de código aberto como Roadsend e phc compilam PHP para C, Quercus compila PHP para Java e Phalanger compila PHP para .Net.

Escusado será dizer que levou mais tempo do que aquele único Hackathon. Oito meses depois, eu tinha código suficiente para demonstrar que é realmente possível executar mais rapidamente com o código compilado. Adicionamos rapidamente Iain Proctor e Minghui Yang à equipe para acelerar o ritmo do projeto. Passamos os próximos dez meses finalizando toda a codificação e os seis meses seguintes testando em servidores de produção. Temos orgulho em dizer que, neste momento, estamos atendendo a mais de 90% de nosso tráfego na Web usando o HipHop, todos apenas seis meses após a implantação.

Como funciona o HipHop

O principal desafio do projeto foi preencher a lacuna entre PHP e C ++. PHP é uma linguagem de script com digitação dinâmica e fraca. C ++ é uma linguagem compilada com digitação estática. Enquanto o PHP permite que você escreva recursos dinâmicos mágicos, a maioria do PHP é relativamente direta. É mais provável que você veja if (...) {...} else {..}do que vê function foo($x) { include $x; }. É aqui que ganhamos em desempenho. Sempre que possível, nosso código gerado usa ligação estática para funções e variáveis. Também usamos inferência de tipo para escolher o tipo mais específico possível para nossas variáveis ​​e, assim, economizar memória.

O processo de transformação inclui três etapas principais:

  1. Análise estática onde coletamos informações sobre quem declara o quê e dependências,
  2. Inferência de tipo onde escolhemos o tipo mais específico entre escalares C ++, String, Matriz, classes, Object e Variant e
  3. Geração de código que, na maior parte, é uma correspondência direta de instruções e expressões PHP para instruções e expressões C ++.

Também desenvolvemos o HPHPi, um intérprete experimental projetado para desenvolvimento. Ao usar o HPHPi, você não precisa compilar seu código-fonte PHP antes de executá-lo. Isso nos ajudou a detectar bugs no próprio HipHop e fornece aos engenheiros uma maneira de usar o HipHop sem alterar a forma como eles escrevem PHP.

No geral, o HipHop nos permite manter os melhores aspectos do PHP e aproveitar os benefícios de desempenho do C ++. No total, escrevemos mais de 300.000 linhas de código e mais de 5.000 testes de unidade.

Trinidad
fonte
4
Esta é a resposta, um pouco de cor teria sido bom, mas basicamente se resume ao desempenho. Eles querem que seu aplicativo seja melhor dimensionado, mas também têm pessoas mais qualificadas em PHP e sentem que o PHP as torna mais produtivas. Portanto, a solução permite a simplicidade do PHP com o desempenho de C. A base de código é muito grande para traduzi-lo manualmente de qualquer maneira.
Cervo
13

Resposta curta - não, você não precisa de C ++.

Eu acredito que você está se referindo ao HipHop . Se você ler sobre as melhorias que ela oferece, são cerca de 50%. Isso é muito importante se você é o Facebook, que possui milhares de servidores front-end. Cortar a carga neles significa milhões em economia de custos do data center. No caso de empresas com 10 a 100 servidores front-end, o custo do desenvolvimento superaria em muito a economia possível. De qualquer forma, o processamento mais pesado é feito no back-end, que geralmente é uma solução RDBMS ou NoSQL, desenvolvida como código C / C ++ altamente otimizado.

É claro que isso poderia ter alcançado uma economia muito maior, apenas descartando completamente o PHP. Mas isso não é algo que você pode fazer com uma enorme base de código, como no caso do Facebook.

Agora, para outra parte da pergunta: se você realmente quer saber como lidar com grandes cargas, leia o blog de Alta Escalabilidade , especialmente a parte Real Life Architectures.

É possível com o PHP, mas definitivamente não seria minha escolha. Se você quer uma linguagem dinâmica, Python, Ruby ou talvez Lua seria uma escolha muito melhor.

vartec
fonte
2
+1, mas a escalabilidade praticamente não tem nada a ver com o idioma usado. A arquitetura do banco de dados tem uma influência muito maior.
22411 daniwaterworth
1
@ Dan: é por isso que estou dizendo - é possível com o PHP.
vartec
2
De acordo com a entrada do blog @Trinidad citada, 50% é a melhoria média , não a máxima.
Jerry Coffin
2
@ Jerry: certo, mas ainda muito, muito longe da diferença real de desempenho entre C ++ e PHP.
Vartec 6/03
6

O bom da abordagem do FB é que eles não precisaram decidir imediatamente. Você deveria fazer o mesmo. Escolha o idioma que o torna mais produtivo, mas certifique-se de que ele faça uma interface fácil com o C / C ++.

Depois de ter milhões de usuários e precisar economizar milissegundos nos tempos de resposta, você pode otimizar caminhos críticos usando C / C ++.

Roger escasso
fonte
0

O elemento C ++ usado pelo Facebook é o HHVM.

Essa é a máquina virtual HIPHOP. Embora escrito em C ++, é essencialmente um "melhor interpretador de PHP".

O código php é compilado no código de bytes, que é interpretado pelo HHVM no momento da execução e está sujeito às otimizações "Just In Time" à medida que é executado.

Os desenvolvedores do livro de face ainda escrevem principalmente em PHP e, o que você vê no seu navegador é quase certamente produzido por um programa PHP - apesar de ter sido compilado e interpretado pelo tempo de execução do HHVM.

O HHVM real é de código aberto disponível gratuitamente. Portanto, se você precisar exibir um milhão de fotos de gatinhos fofos por hora, poderá fazer o download do HHVM e acelerar o servidor com alterações mínimas no PHP.

James Anderson
fonte