読者です 読者をやめる 読者になる 読者になる

Mobageを支える技術を読みました。

book

Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)

Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)

Mobageを支える技術を読みました。35億PV/dayをさばくという会社の運用方法、開発の考え方を知りたくて読んでみました。

すごく濃厚な本なので、一回読んだだけで全てを理解しきれていないのが正直言って現状です。
それでも今読んで面白かった箇所を少しだけ紹介します。

下記のポイントが面白かったです。
1. 高パフォーマンスに見せるための工夫
2. HandlerSocketPluginにより、MySQLをNoSQLライクに使用する。
3. アプリケーションチューニング、キャッシュの使いドコロ。

それぞれ紹介していきます。

高パフォーマンスに見せるための工夫


ローカルキャッシュを効かせる、javascript, CSSの圧縮は勿論ですが、アイコン画像などの小さめの画像を1枚の画像として送り、CSS spriteを使って分割して表示することで1回のHTTPリクエストでまとめてアイコン一覧が取得出来るようになります。

CSS sprite、常識なのかもしれないけど、今の開発ではアイコンを呼び出す時に小さめの画像を毎回呼び出しているから普通に使えそう。
他にもJavascriptロードのテクニックが以下のように紹介されていました。

javascriptをbody終了タグの前に書く

….
<script type="text/javascript" src="http://example.com/js/aaa.js">
</script>
<script type="text/javascript" src="http://example.com/js/bbb.js">
</script>
</body>
</html>

これを実行すると、画像やCSSを早めに読み込んでレンダリングすることができます。ただし、javascriptが読み込まれるのが遅くなるので、ローディングインジケータが回り続けてしまい、ユーザを待たせている印象を与えてしまいます。これに対して、動的ロードテクニックも紹介されていました。以下のようにjavascriptの中でjavascriptを後で呼び出すことで見た目的にはローディングインジケータが回らずに済ませることができます。

■JavaScriptの遅延ロード

var script = document.createElement('script');
script.src = 'big_script.js';
document.getElementsByTagName('head')[0].appendChild(script);

ちょっとした事なのかもしれないけど、ユーザーを待たせないテクニックですね。

HandlerSocketPluginにより、MySQLをNoSQLライクに使用する。


頻繁にアクセスされる可能性があるデータはmemcached等でキャッシュするというのが定石です。更新する時にデータベーストリガーでキャッシュも更新するという方針です。
ただ、データベースにもバッファキャッシュというキャッシュ領域があるため、memcachedにも同じようなデータを持つというのはあまり効率的ではありません。

Mobageでは単純なレコードのアクセスはmemcachedを使わずに、HandlerSocketを使います。HandlerSocketはNoSQLライクなアクセス方法でMySQLにアクセスする方法でmemcachedに頼らなくともバッファキャッシュ側でキャッシュをフルに活かす事が可能です。

もちろん、memcachedを全く使用していないというわけではなく、レコードから加工されたデータを扱う時に使用しているようです。

これでキャッシュサーバーの数を削減することに貢献できているとのことで、性能面、コスト面での効果も両立している素晴らしい機能です。

アプリケーションチューニング、キャッシュの使いドコロ。


memcachedを使ったキャッシュをし、キャッシュサーバーを何台も持っていると、一つのキャッシュにアクセスが集中することがあります。
これにより、アクセス過多が原因でレスポンス低下を招いてしまうと元も子もありません。

f:id:yosuke_furukawa:20120902224747p:plain

キャッシュデータのコピーを分散させればキャッシュサーバーのアクセスも分散されるしいいんじゃね?と思ったんですが、これだとキャッシュのアクセスは分散されますが、キャッシュを更新する時にキャッシュサーバー台数分更新が必要になるため、更新が頻繁に発生するデータに弱くなります。

f:id:yosuke_furukawa:20120902224754p:plain

これに対して、Mobageでは、キャッシュのキャッシュをApplicationサーバーに持つことでアクセス効率をあげています。こうすれば、キャッシュが集中することも避けられます。もちろん、リアルタイム性が強いデータには向きませんが、更新が頻繁に発生するが、参照時にはリアルタイム性が低いデータには応用が効きます。

まとめ


Mobageでは、HTTPリクエストを少なくする、javascriptローディング方法を変える等のフロントエンドでも工夫があります。また、データベース側ではHandlerSocket等でMySQLでも効率的に使用出来る方法を考えています。さらにキャッシュをうまく利用してキャッシュサーバーのアクセス効率もあげています。

ハイパフォーマンスに見せるための話だけではなく、運用の方法なども面白いので、興味があれば読んだほうが良いです。