2004年05月30日

素行の悪いRSSリーダー

ちょっと前の話ですが、RSSリーダーがインターネット渋滞の元凶になるという記事HotWiredに掲載されていました。

HeimdallrというRSSリーダーを開発している身にとって、他人事ではないので、ちょっと考えてみることにしました。

今のHeimdallrは、上記記事にあるような

RSSリーダーは通常、前回のアクセス時以降、RSSファイルが更新されたかどうかをチェックする仕組みになっている。もし更新がなかった場合、ウェブサイトは「no」(なし)というごく小さなメッセージをRSSリーダーに返す。

というようにはまったくなっていません。
記事の更新を行う際、毎回コンテンツを全部ダウンロードしています。
いやぁHeimdallrは素行の悪いRSSリーダーですね。

RSS Feedって画像やらなんやらの重たいコンテンツが含まれていないので
取得回数が多くても平気だと思っていました。
しかし、現実に問題が発生しているサイトがある以上、無視するわけにもいかないでしょう。

といっても、実際の所、Heimdallrは、更新間隔は30分以下には設定できないようにしてありますし、
デフォルトの更新間隔は60分となっていますし、
なによりマイナーなので使用者が少ないため、
問題を引き起こす可能性は少ないでしょう。

しかし、Heimdallrがもし爆発的に普及すると(ありえなさそうですが)、
Heimdallrのせいでサイトが落ちたとか言われかねません。
そこで、上記の仕様のとおりに実装し、サーバーに大きなコンテンツを要求する回数を減らすようにしようと思いました。

ところが、技術的にどう実装すれば良いのか良く分かりません。特に分からないのがこれ。

ウェブサイトは「no」(なし)というごく小さなメッセージをRSSリーダーに返す。

これってどうやればいいんだろう・・・。誰か何かご存知でしたら教えて下さい。
良く分からないので、ちょっと考えた挙句、以下のような仕様にすることにしました。

  • 最初はサイトにGETメソッドでリクエストを送信し、コンテンツを取得する。このとき、レスポンスHTTPヘッダのLast-Modifiedフィールドの値を記録しておく。
  • 二回目以降は、まずHEADメソッドでリクエストを送信し、レスポンスHTTPヘッダのLast-Modifiedフィールドの値を取得して前回の値を比較する。同一ならばコンテンツはダウンロードしない。同一でなければあらためてGETメソッドでリクエストを投げてコンテンツを取得する。

実は、現時点でほぼ実装が終わってテスト中です。
サーバーへの負荷がどうなったのかは良く分かりませんが、更新するのに必要な時間がだいぶ短くなりました。感覚的には1/3以下ですね。

次のバージョンであるHeimdallr 1.04alpha3ではこの機能をお披露目できると思います。

投稿者 MASATO : 2004年05月30日 21:02 | トラックバック
コメント

If-Modified-Since を使えばいいようですね。これならHEADとGETの二回に分けなくても良いですし、転送量が少なくて済みそうです。

Posted by: MASATO : 2004年05月31日 21:23
コメントする









名前、アドレスを登録しますか?