InfoQ

News

Facebookチャットアーキテクチャー

作者 Gavin Terrill , 翻訳者 編集部 投稿日 2008年5月19日 午後6時26分

コミュニティ
Architecture
トピック
パフォーマンス&スケーラビリティ
タグ
Erlang,
C++

Facebookのエンジニアリングのブログ(source)上で、ソフトウェアエンジニアであるEugene Letuchy氏が最近、Facebook Chatの背景にあるエンジニアリングに関する決定(source)について詳細を書いた。

機能のユーザベースが実際には一晩で0から7000万になる場合、最初からスケーラビリティを考えておく必要がある。

Eugene氏はそのサイズのユーザベースに対する多くの課題を 特定した。

ユーザがオンラインであろうと、オフラインであろうと、すべての友達に通知を送信するという単純な実装は1秒につきO(平均的な友達リストサイズ*ピーク ユーザ * チャーン率)メッセージという最悪のケースをはらんでいる。ここでチャーン率は、1秒ごとのイベントでユーザがオンラインとオフラインになるユーザの周波 数のことである。ユーザごとの平均的な友達の数が百単位で計測され、サイトのピーク時の並行ユーザの数が数百万であることを考慮すると、このことは広く受 け入れがたいとは言えない。

もう1つの課題は、リアルタイムでメッセージを送ることであった。Facebookは、CometのXHR Long Polling Process(source)と同様な方法をとっている、クライアントがサーバから更新を引き出すテクニックを選択している。

われわれが選択した、1人のユーザからテキストを取得し他のユーザに渡すそのメソッドには、各Facebookページでiframeをロードし、その ifameの Javascriptをそのクライアントのデータをサーバが保持している限り、返さないHTTP GET要求にする。

Eugene氏は続けて「長時間実行中の同時要求が大量にあると、標準LAMPのApacheの部分が疑わしい実装の選択を溜め込んでしまう」と語る。

FacebookはC++およびErlangを選択し、 クラスター化およびパーティション化されたサブシステムを実装する。C++モジュールがチャットメッセージの記録に使用される一方で、Erlangが「オ ンラインユーザの会話をメモリー内に保持し、 長時間ポーリングされたHTTP要求に対処する」。Linux 2.6で導入されている新しいシステムコールは、Erlangモジュールの駆動に使用された。Eugene氏は、Erlangでおこなうことに決めた理由 を以下のように述べている。

つまり、問題のドメインがグローブのようにErlangとぴったり合う。Erlangは機能的な並行性指向の言語であり、極めて軽量なユーザスペース「プ ロセス」、 share-nothingメッセージパッシングセマンティクス、内蔵型ディストリビューションを装備し、大規模なソフトリアルタイム稼動システムでの 20年間にわたるデプロイメントによって証明された「クラッシュおよびリカバー」の考えを固持している。

「スケーラブルなクロス言語サービス開発」向けのオープンソースフレームワークであるThrift(source)(昨年のエイプリルフールにFacebookに よってリリースされた)は、Facebook Chatで使用されているさまざまなテクノロジーを結束させるために使用された。今は、Erlangのバインディングを特色としている。

かつて興味深いアプローチは、いわゆる「dark launch」と呼ばれるサービスのロールアウトであった。

ユーザが一晩で0から7000万になる秘密は、すべてを一挙にするのを避けることである。われわれは「dark launch」期間、多くのマシンを叩いているリアルユーザの影響をシミュレーションすることにした。「dark launch」では、Facebookページがチャットサーバと関連づいて、情報の照会をし、ページに描かれた単一UIエレメントなしでメッセージ送信を シミュレートする。

FacebookエンジニアによるErlangの選択は、その言語にとって重要な承認である。 ErlangのエバンジェリストであるYariv Sadan氏(source)は、以下のように述べている。

この発表によって、Erlangがスケーラブルなリアルタイム(aka Comet)アプリケーションを構築するための *the*プラットフォームであることに対するあらゆる疑いを取り除くに違いない。

原文はこちらです:http://www.infoq.com/news/2008/05/facebookchatarchitecture

ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
slashdot+
Hatena

特集コンテンツ一覧

Agile Japan 2009

2009年4月22日、東京千代田区にある放送会館で「アジャイルジャパン2009」が開催されました。本イベントは「ソフトウェア開発の次世代リーダーをつくる」ことを合い言葉に、200人以上の参加者を集めてスタートしました。

Flex 4の新機能トップ10

今週(2009年6月1日)AdobeはFlex 4の正式な初ベータ版をリリースしました。Flex 4はGumboというコードネームで開発されています。今回のリリースには大きな変更が多数含まれています。このRIAフレームワークの最新バージョンにおいて変更された事柄についての概要を以下のリストで見ていきましょう。

Domain Driven Design(ドメイン駆動設計) Quickly 日本語版

ビジネス領域の深い理解を反映したドメインモデルを設計するための、ヴィジョンとアプローチです。この本は、Eric Evans氏の「Domain Driven Design」の主要点を短く読みやすく要約しました。

JavaプログラマがFlexとBlazeDSを学んだ方がいい13の理由

この記事ではJavaプログラマがなぜFlexとBlazeDSを学ぶべきなのかについて13の理由を述べています。なぜ高度にインタラクティブなWeb サイトからJavaで開発されたバックエンドをもつエンタープライズ・アプリケーションまでを含む、リッチ・インターネット・アプリケーション(RIA)の開発にFlexとBlazeDSの組み合わせが最適な選択肢となるのかについて述べています。

仮想パネル: バックログは重要な成果物とプラクティスか、それとも無駄か?

Mary Poppendieck氏、Ron Jeffries氏、Jeff Patton氏、David West氏、Steve Freeman氏、Jason Yip氏が、バックログに関する彼らの意見とアジャイルチームを成功させるために必要な事を語った。

Perf4Jを使ったパフォーマンス解析とモニタリング

この記事ではAlex Devine氏が、Java開発者がPerf4Jをどのように利用できるかと、タイミングステートメントにコードを追加し、ロギング、結果の解析とモニタリングを行うオープンソースツールセットの説明をします。

複雑な外部DSLを開発する

本稿では、Vaughn Vernon氏が内部DSLと外部DSLの違いを説明し、複雑な外部DSLを開発する際のステップを示します。

J2EEアプリケーションにおけるAOPを使ったフェッチ戦略の実装

この記事では低レベルのサービス・レイヤやリポジトリ・レイヤを肥大化させることなく、フェッチング・ストラテジによってモジュール化された方法でバックエンドにあるシステムからデータを取得する処理を最適化する方法について説明します。