サンプルアプリケーションの高速化手法を検討しましょう。
AWS 基礎入門チュートリアルについて
このページは AWS 基礎入門チュートリアル の一部です。 AWS チュートリアル全体は AWS 基礎入門チュートリアル を参照してください。
現状分析
フォロー機能付き Mini Twitter では下記の問題が発生しています (ということにしてください)。
- 数百万人の利用者が殺到して、画面表示が遅く、クレームが殺到している
- データベースがボトルネックである
- データベースチューニングではどうやっても改善できない
- テーブル構成の大幅見直しで高速化が見込まれるが、改修までに数ヶ月かかる見通し。
高速化アプローチ
DB まわりが遅いので、EC2 を何台増やしても解決しません。 DB チューニングもすぐにはできません。こういう場合、人間工学的なアプローチでいきましょう。
- 利用者にとって、多少古くてもよい情報について、あらかじめ保存しておいた情報を使い、DB アクセス回数を減らす。
- 利用者にとって、多少古くてもよい情報について、別の環境で処理し、DB アクセス回数を減らす。
- 利用者にとって、多少古くてもよい情報について、後からまとめて処理をすることで、DB アクセス回数を減らす。
- 最新情報が必要な箇所のみ、やむなく DB アクセスを行う。
サンプルアプリケーションにおいて古くてもよい情報とは何か、最新情報が必要な箇所とはどこか。 例えば以下のような感じです。
- フォロー数・フォロワー数は多少古くても問題ない (古いことに気づくことができない)
- フォロワー 一覧も、多少古くても問題ない (古いことに気づくことができない)
- 他人のツイート一覧は、多少古くても問題ない (古いことに気づくことができない)
- フォロー 一覧は、自分がフォローしたユーザが表示されていないと不安に感じてしまうので、最新状態としたい。
- 自分のツイート一覧は、投稿したばかりのツイートが表示されていないと不安に感じてしまうので、最新状態としたい。
- 認証まわりは最新情報にて行いたい。
- 初期画面の外にある情報 (下にスクロールすることではじめて表示される情報) は、後から読み込んでも構わない。
上記改善において、本チュートリアルでは Amazon ElastiCache を使うことにします。
Amazon ElastiCache
Amazon ElastiCache は AWS のサービスの一つで、キャッシュ管理サービスです。 Redis と Memcached というオープンソースのアプリケーションがあるのですが、 それを AWS 上で簡単に使えるようにしました、というものです。
Redis を使うか Memcached を使うかは決めないといけないのですが、 本チュートリアルでは高機能な Redis を使います。
何ができるかというと非常にシンプルで、基本的には下記です。
- あるキー (例: mykey) に対応する値 (例: hogehoge12345) を ElastiCache に保存することができる。
- 保存しておいたキー (例: mykey) に対応する値 (例: hogehoge12345) を ElastiCache から取得することができる。
例えば、account_id: 1 のツイート数を
account_id_1_tweet_count: 123
として保存します。
その後、キー “account_id_1_tweet_count” の値を ElastiCache に問い合わせると “123” が返ってきます。
上記の情報は保存期間を決めることができるので、「60秒保持」「1時間保持」「1日保持」などとデータの性格に応じて設定可能です。
ElastiCache を使う場合、一般的にはアプリケーションの修正が必要です。 下記のような
$dbh = DB接続;
$sth = $dbh->preapare("select mycol from mytable where id=?");
$sth->execute(array($id));
$res = $stmt->fetch();
echo $res['mycol'];
$dbh = DB接続;
$redis = Redis接続;
# Redis からキャッシュを取得
$mycol_value = $redis->get("mycol"+$id);
if ( $mycol_value === false ){
# Redis にキャッシュがなければ DB から取得
$sth = $dbh->preapare("select mycol from mytable where id=?");
$sth->execute(array($id));
$res = $stmt->fetch();
$mycol_value = $res['mycol'];
# DB から取得した値を Redis に登録
$redis->put("mycol"+$id, $mycol_value);
}
echo $mycol_value;
このようなサービスを「キーバリューストア」「Key-Value Store」「KVS」などと言います。
次ページ ElastiCache 構築・設定 に進んでください。