httpで負荷を下げる仕組みはいくつか有る。
「何月何日の何時のデータから更新されていますか?」と問い合わせ時に聞くのがIf-Modified-Sinceヘッダー。
「キャッシュデータのハッシュ(ETag)は○○です。これと一致しているデータですか?」と聞くのがIf-None-Matchヘッダー。これは同一のデータだったら同一のEtagになるという仕組みを利用している。
この辺りは @IT:事例に学ぶWebシステム開発のワンポイント(12)_ が分かりやすく解説している。
んでだ。
MASATOの開発日記: BLOGサービス調査(2/2)_ を見てみると、はてなダイアリー等のblog事業者はIf-Modified-SinceにもIf-None-Matchにも対応しておらず、Simple Stupidに200で毎回RSSを返すところがチラホラあるみたいだ。
理由は色々と有るんだろうなぁ。
RSSアグリケーター側がIf-Modified-Since等に対応していなかったりして、毎回バカのようにデータをダウンロードすることが多かったりするから、苦労して対応する必要がなかったとか。
あと負荷分散でサーバーを分離しているとi-nodeの違いでEtagを統一するのがややこしいからIf-None-Matchをサポートするのがめんどくさいとか。
確認の仕方:
上記のBLOGサービス調査はちょっと古い一覧なので、自分で確認してみることに。
なんたってblogサービス技術は数日もあればすぐに変わっちゃうからな。
Goatee: efficient RSS over HTTP_ によるとwget -Sで簡単に確認できるみたい。
まず普通にはてなダイアリーからRSSをwgetで取得。
次にIf-Modified-Sinceを付けてみる。
ということは、はてなダイアリーRSSに関して言えば、RSSリーダー側でちゃんとIf-Modified-Sinceヘッダーをサポートしているモジュールなりライブラリを使っていれば負荷軽減にはなるんだな。
なんたってblogサービス技術は数日もあればすぐに変わっちゃうからな。
Goatee: efficient RSS over HTTP_ によるとwget -Sで簡単に確認できるみたい。
まず普通にはてなダイアリーからRSSをwgetで取得。
>wget -S http://d.hatena.ne.jp/otsune/rss
--06:36:27-- http://d.hatena.ne.jp/otsune/rss
=> `rss'
Resolving d.hatena.ne.jp... 221.186.129.146, 61.196.246.67, 221.186.146.29
Connecting to d.hatena.ne.jp|221.186.129.146|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Date: Wed, 10 Aug 2005 21:36:49 GMT
Server: Apache/1.3.27 (Unix) (Vine/Linux) mod_perl/1.29
last-modified: Wed, 10 Aug 2005 09:46:15 GMT
etag: f77052105e8f1e6cd99141478cbbee93
Content-Type: application/xml; charset=utf-8
Vary: Accept-Encoding
Connection: close
Length: unspecified [application/xml]
[ <=> ] 13,510 --.--K/s
06:36:28 (102.43 KB/s) - `rss' saved [13510]
次にEtagを付けてIf-None-Matchを送ってみる
> wget -S --header='If-None-Match: f77052105e8f1e6cd99141478cbbee93' http://d.hatena.ne.jp/otsune/rss
--06:37:09-- http://d.hatena.ne.jp/otsune/rss
=> `rss.1'
Resolving d.hatena.ne.jp... 221.186.129.146, 61.196.246.67, 221.186.146.29
Connecting to d.hatena.ne.jp|221.186.129.146|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Date: Wed, 10 Aug 2005 21:37:31 GMT
Server: Apache/1.3.27 (Unix) (Vine/Linux) mod_perl/1.29
last-modified: Wed, 10 Aug 2005 09:46:15 GMT
etag: f77052105e8f1e6cd99141478cbbee93
Content-Type: application/xml; charset=utf-8
Vary: Accept-Encoding
Connection: close
Length: unspecified [application/xml]
[ <=> ] 13,510 --.--K/s
06:37:10 (747.16 KB/s) - `rss.1' saved [13510]
うーん、200で普通にダウンロードになっているね。次にIf-Modified-Sinceを付けてみる。
> wget -S --header='If-Modified-Since: Wed, 10 Aug 2005 21:37:31 GMT' http://d.hatena.ne.jp/otsune/rss
--06:53:00-- http://d.hatena.ne.jp/otsune/rss
=> `rss.2'
Resolving d.hatena.ne.jp... 221.186.129.146, 61.196.246.67, 221.186.146.29
Connecting to d.hatena.ne.jp|221.186.129.146|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 304 Not Modified
Date: Wed, 10 Aug 2005 21:53:22 GMT
Server: Apache/1.3.27 (Unix) (Vine/Linux) mod_perl/1.29
Connection: close
Vary: Accept-Encoding
06:53:00 ERROR 304: Not Modified.
おお、304が帰ってきて負荷軽減に対応している。ということは、はてなダイアリーRSSに関して言えば、RSSリーダー側でちゃんとIf-Modified-Sinceヘッダーをサポートしているモジュールなりライブラリを使っていれば負荷軽減にはなるんだな。



[ コメントする ]