イベントキュー処理システムは、Webサーバとは別のサーバで動作し、随時次のような処理を行っています。
また、実際にGREEで動作しているコードは、
となっています。
$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では、こういった問題をさらにエレガントに解決したい方、さらなる未知の問題に対して知恵を絞って挑戦していきたい方、そしてそういった問題を新たに生み出す新しいサービスを一緒に作っていくエンジニアの方を募集しています。ご興味のある方はぜひぜひ、わたしにメール*をいただければと思います。
fujimoto at gree.co.jp(atの部分は@に置き換えてください)。
Copyright © ITmedia, Inc. All Rights Reserved.