Proxygenの背景にあるアイデアは、Apacheを置き換えるものではなく、Webサービスを提供する既存のアプリケーションに組み込むことのできる特別に高性能なWebサーバを作れるようにすることだ。これはもともとFacebookがproxyサーバ(名前はここから来ている)を構築するために2011年に始めたものだ。そのプロジェクトが進化し、実環境における何年ものテストを経て、今回オープンソース化された。
なぜApacheやnginxといったサーバから始めなかったのだろうか? Facebookはさまざまな理由を述べている:
- 既存のインフラやツール(Thrift、ODS) と統合できること
- 別の内部プロジェクト(Haystack、HHVM、ロードバランサなど)で使われるイベント駆動ライブラリを作ること
- Facebookによると、以前のHTTPインフラはスケーラビリティの限界に達し、「多数のワークアラウンド」を必要としたため、自分たちの望み通りに内部開発できるものが必要だった
- 当時、既存のHTTPサーバには足らない機能がたくさんあった。SPDY、WebSockets、HTTP/1.1 (keep-alive)、TLSフォールススタート、特有のロードスケジューリングアルゴリズム
Proxygenはトランザクション(transaction)、セッション(session)、コーデック(codec)、ハンドラ(handler)といった概念を用いている。トランザクションはクライアントとサーバ間で交換されるリクエスト-レスポンスのペアを表現している。セッションは一連の関連するトランザクションを表現している。回線からやってきたバイト列は、トランザクションと関連づけられたコーデックによって、オブジェクトへとパースされる。最終的に、メッセージは実際の処理をするハンドラに渡される。コーデックとトランザクションといった低レベルなものを使ってフレームワークとやり取りすることもできるが、開発者はAPI経由の高レベルな抽象層を使うことが推奨されている。
Proxygenは以下に依存している。
- Folly – Facebookによって内部的に使われているC++11コンポーネントのオープンソースライブラリ。コードのベンチマーキングフレームワーク、エンディアン変換プリミティブ、最適化された文字列とベクタ、JSONシリアライザなどが含まれている。
- FBThrift – Apache TriftのFacebookブランチ。
ProxygenはSPDY 3.1をサポートし、HTTP/2のサポートも追加しているところだ。Facebookによる32論理コアXeon CPU E5-2670 @ 2.60GHz、16GB RAMでの社内ベンチマークによると、Proxygenのecho serverはSPDY 3.1上で毎秒304,197インメモリGETリクエストを扱えるそうだ。
GitHubにリリースされたソースコードはUbuntu 14.04でテストされているが、指定されていないものの、他のシステムで動かしても安全だとFacebookは考えている。