AWS 基礎入門チュートリアル – サンプルアプリケーションの高速化手法検討編

  • このエントリーをはてなブックマークに追加

サンプルアプリケーションの高速化手法を検討しましょう。

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 構築・設定 に進んでください。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

Leave a Reply

*

CAPTCHA