2010-12-22

【Amazon】AWSを使ってすばやい表示をするサイトを作る

表題の通り、AmazonのWebAPIであるAWS(名前がころころ変わるからこれでいいのか分からないw)を使ってすばやい表示のサイトを作った時のメモ。

まず、ページを表示するたびにAPIへ接続しデータを取得するようなサイトは表示が「遅い」し、ページビュー数が増えてくるとAPI提供側から規制が掛かったりする。
そこで、すばやくするためにはどうしたらよいかを考えた。

考えた結果、以下の2つを目標とすることにした。
・表示を早くする
・APIへのアクセスを低減する


という2つの目的を同時に実現するために以下のことをした。

---
1.自サイトを置いているサーバにAPIの結果をキャッシュとして保持し、それをファイルに保存しておく

2.APIへアクセスする時のURLはほぼ一意(ユニーク)なので、URLをmd5やsha1等でハッシュした結果をキャッシュのファイル名とした

3.APIのデータはXMLで返されるので、キャッシュに保存するのは「XMLをパースした結果のシリアライズされたもの」とする。読み込み時にアンシリアライズすればデータ取得が容易になる
---

1.で保存したキャッシュが「存在するならばAPIへはアクセスしない」というプログラムにすれば「APIアクセス低減」と「表示の高速化」が実現する。
しかし、APIで返されるデータは日々更新されるので、いつかは古いデータとなってしまう。これを回避するには「キャッシュを更新」する必要がある。
しかし、更新間隔を狭めて頻繁にAPIにアクセスするようなプログラムにすると結局「遅い」し「規制に掛かる」可能性がある。
この問題には以下のように対処した

---
1.個々の商品詳細データは「ほぼ更新されない」という「前提にした」(実際は価格などが更新される)ので、キャッシュの更新はしないこととした

2.商品一覧データは売れ筋が上に来る(APIで異なる指定が可能だが)ので、サイト構成上重要だから1週間で更新されるようにした

3.更新自体はプログラムがキャッシュへアクセスするときに「ファイル作成日付を確認し」1週間より前なら「APIへアクセスしデータを取得する」、とした
---

これでもAPIが規制に掛かってしまってエラーが返されたら、それは保存せずに従前のキャッシュを返すようにもした。
これで表示に大体1ページ数秒掛かっていたのが、1秒以内で表示されるようになった。


---
データベースが使えるならそちらのほうがプログラムが簡単かもしれない。データベースに全てのデータを突っ込んでおけばメンドウはないかもしれないし。
自分はデータベースを使用する方がメンドウだ、と作ったときは感じたのでそうしたけどね。

あと、この方法は小規模のそれほどページビューが多くないサイトを想定してます。具体的には1日1万ページビューくらい。
なので、もっと大規模なサイトならそれにあわせたものにしないとだめでしょう。

ZenBack

WebMoney ぷちカンパ