A ideia por trás do Proxygen não é substituir o Apache mas possibilitar a criação de um web server de alta performance especializado, capaz de ser embarcado em aplicações existentes provendo web services. O Facebook inicialmente começou a construir um servidor proxy (daí a origem do nome Proxygen) em 2011 e, agora que o projeto evoluiu e tem sido testado em produção por alguns anos, eles estão tornando o código aberto.
Por que não começar com um Apache, Nginx ou outro servidor web? O Facebook destacou uma série de motivos:
- Habilidade de integração com sua infraestrutura e ferramentas (Thrift, ODS);
- Criação de uma biblioteca orientada a eventos passível de ser utilizada em diferentes projetos internos (Haystack,HHVM, load balancer, etc.);
- De acordo com o Facebook, sua infraestrutura HTTP anterior tinha atingido alguns limites de escalabilidade e demandava "muitos workarounds", então eles queriam algo que pudesse ser desenvolvido internamente e bem como desejassem;
- Um número de funcionalidades estava faltando nos servidores HTTP existentes naquela época: SPDY, WebSockets, HTTP/1.1 (Keep-alive), TLS false start, e algorítimos específicos de programação de carga.
O Proxygen utiliza os seguintes conceitos: transação, sessão, codec e manipulador. A transação representa um par "request-response" trocado entre um cliente e um servidor. Uma sequência destas transações representa uma sessão. Os bytes vindos do cliente são convertidos em objetos por um codec que os associa a uma transação. A mensagem é, eventualmente, encaminhada para um manipulador, onde é processada. Uma vez que é possível interagirmos com o framework em baixo nível de codecs e transações, os desenvolvedores são orientados a usar abstrações de mais alto nível através de uma API.
O Proxygen depende das seguintes abstrações de dados e rede:
- Folly - uma biblioteca de código aberto, escrita em C++, que contém 11 componentes usados internamente pelo Facebook, entre eles um framework de benchmarking de código, conversões endian primitivas, strings e vetores otimizados, serializador de JSON, entre outros;
- FBThrift - um branch do Apache Trift.
O Proxygen possui suporte para o protocolo SPDY 3.1 e está adicionando suporte para o protocolo HTTP/2. Durante um benchmarking interno realizado pelo Facebook em um servidor Proxygen, com 32 processadores lógicos Xeon CPU E5-2670 @ 2.60GHz com 16 GB de memória RAM e utilizando o protocolo SPDY 3.1, serviu até 304.197 requisições GET em memória por segundo.
O código-fonte disponibilizado no GitHub foi testado no Ubuntu 14.04, mas o Facebook considera o seu uso seguro em outros sistemas operacionais, sem especificar quais.