大規模SNSのボトルネックとソリューション:大規模サイトの舞台裏(4/4 ページ)
SNSは比較的データアクセスが多いアプリケーションであり、負荷対策が難しい部類に入る。本稿では、グリーCTOの藤本真樹氏が、GREEというSNSでの経験を基に、SNSの具体的な負荷軽減ソリューションを紹介する。
イベントキュー処理システム
イベントキュー処理システムは、Webサーバとは別のサーバで動作し、随時次のような処理を行っています。
- イベントキューを監視する
- キューにデータが存在していたら、operationフィールドの値に従って適切なイベントキューハンドラを呼び出す
- イベントキューハンドラがそれぞれ処理を行う
また、実際にGREEで動作しているコードは、
- イベントキュープロセッサにイベントリスナーオブジェクトを追加(リスト4)
- イベントキューを引数としてイベントキュープロセッサを実行(リスト5)
となっています。
$qp = &new QueueProcessor();
// 友達の新着blog用イベントリスナーオブジェクト
$lsnr = &new Blog_ActionEventListener_RecentFriendEntry($log, $rm, $num_recent_entries_to_fill);
$qp->addListener($lsnr);
$dbq = &new Gree_Queue_DB_BlogEvent($queue_conn, $json, $blog_uri_str);
$err = $qp->process($dbq);
これによって、イベントキューのoperationフィールドに対応する、イベントリスナーオブジェクトのメソッドが呼び出されます。ここで、日記を更新したユーザーの友達全員の新着日記データを更新して回ります(リスト6)。
function blogEntryAdded($primary_author_uri_str, $entry_uri_str, $params) {
:
:
}
このように、非同期に新着情報やそのほかのデータを追加、更新する機構を準備することで、友達の新着情報を単純なクエリで取得できるようになります。このほかにも、
- 先頭数件をキャッシュデータとして保持しておけば、ホーム画面表示時のデータベース負荷を削減できる
- アクセス許可設定変更時にインデックスを更新できる
といった効果があり、幾つかのボトルネックを解消できています。
おわりに
本稿では、SNS特有のボトルネックとそのソリューションについて、可能な限り具体的に解説しました。本稿が何かの参考になれば幸いです。
本稿をお読みになった方の中には、「何の得にもならなそうなのに、なぜこんな技術情報を公開するのだろう」と思われる方も、もしかするといらっしゃるかもしれません。
こういった情報を公開するモチベーションの1つとして、こういった情報が大げさではありますが「インターネットサービス全体の成長に一役買えれば」という思いがあります。
本稿で紹介したような情報は、ほかの皆さんが公開されているオープンソースソフトウェアや技術情報なしには成り立ちませんし、現在のインターネットサービスの発展は、安価なハードウェアやオープンソースソフトウェア、そしてそれを利用するためのさまざまな(無償で、あるいは安価に提供される)解説なしには成り立ち得ませんでした。
ここに記したものが、最良であるとはまったく思っていませんし、改善の余地は大いにあると思います。ですので、本稿がきっかけになってさらに良いノウハウが得られ、それをベースにさらに良いものを……、という循環の一助となればと思います。
それと、最後に宣伝です:)。GREEでは、こういった問題をさらにエレガントに解決したい方、さらなる未知の問題に対して知恵を絞って挑戦していきたい方、そしてそういった問題を新たに生み出す新しいサービスを一緒に作っていくエンジニアの方を募集しています。ご興味のある方はぜひぜひ、わたしにメール*をいただければと思います。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このページで出てきた専門用語
わたしにメール
fujimoto at gree.co.jp(atの部分は@に置き換えてください)。
関連記事
- 大規模SNS実現のためのGREEのアプローチ
大規模なサイトでは、どのようにWebアプリケーションをスケーラブルに構築しているのか。GREEのアプローチを、グリー取締役CTOにして、PHPフレームワークEthna(えすな)の開発者でもある藤本真樹氏が解説する。Webアプリケーション開発者必見だ。 - sysprofでシステム全体の動作をプロファイリングする
アプリケーションを最適化するには、どの関数が最もCPU時間を消費しているかを明らかにし、そうした部分のコードの高速化に集中させればよい。ここでは、パフォーマンスのボトルネック調査に利用できるsysprofを紹介しよう。
関連リンク
Copyright © ITmedia, Inc. All Rights Reserved.