• ベストアンサー

[プログラムでアクセス] 先着順で競い負ける

サイト情報を監視して、そのサイトが更新されたら即座に、 POSTデータを送るシステムをPerlのLWPを使って作ってみたのですが、 トップ500には入れるのですが、トップ10には滅多に入れません。 何度やっても、ライバルに負けてしまいます。 一般にどういった事が原因として考えられますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ky072
  • ベストアンサー率60% (85/140)
回答No.3

状況が良くわかりませんが、実現可否はともかく高速化できそうなネタを挙げてみます。 (1) 監視の間隔の短縮 例えば、10秒毎に監視しているとすれば、1秒毎に監視しているライバルに負ける可能性が高いです。可能な限りポーリングの間隔を短くしましょう。Keep-Aliveのセッションを作った上で、リクエストを連続して発行するのが良いでしょう。アクセス制限されたりする場合、複数のIPアドレスを使い分けることも検討します。 (2) DNSによる名前解決の時間を節約 DNSで名前解決をすると時間がかかります。http://203.0.113.69/ のようにIPアドレスでアクセスしたり、/etc/hosts にあらかじめ対象ホストのIPアドレスを記録するなどします。接続時にはIPアドレスを直接指定した上で、HTTPのHostリクエストヘッダを自前で指定するのが良いでしょう。 (3) プログラム実行速度を上げる PerlのLWPより高速なプログラムを利用します。一番良いのはC言語で専用プログラムを組むことです。または、Linux環境であれば以下のようにncコマンドを使うのも手です。 % /bin/echo -en 'HEAD / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n' | nc 203.0.113.69 80 % cat POST-REQUEST.dat | nc 203.0.113.69 80 (4) 更新の有無を判断する効率を上げる 更新されたか否かを判断する方法が非効率的ではありませんか。対象となるサイトや更新の内容にもよりますが、GET リクエストの代わりに HEAD リクエストを活用して Last-Modified や ETag、Content-Length などで判断できれば高速化できます。GET リクエストを使うとしても、全文を比較するよりはサイズなどで比較する方が高速です。 (5) POSTの高速化 あらかじめPOSTデータを含むHTTPリクエストのデータを作成して準備しておき、直ちにPOSTできるように準備しましょう。可能であれば、GET/HEADリクエストの通信をKeep-Aliveにしておき、接続を繋いだまま更新をチェック、同じセッション内でPOSTできれば良いです。 (6) サイトの特性を利用 対象のサイトの特性を利用して、ライバルを出し抜けるかもしれません。同じページの更新をチェックするとしても、ページそのものより、RSSをチェックした方が早い場合もあります。掲示板サイト等では、生データにアクセスできるURLが存在することもあります。また、アクセスが集中するようなサイトの場合、別のIPアドレスでアクセスしたり、HTTPの代わりにHTTPSでアクセスすることで混雑を避けることができることもあります。

takumiio
質問者

お礼

とてもたくさんのアドバイス頂きありがとうございます! 出来そうなことから改良してみようと思います。

その他の回答 (3)

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.4

1秒間に何回情報取りに行っているの? DDOS攻撃と間違われているとか。

takumiio
質問者

お礼

回答いただきありがとうございます。 相手からは、めったにエラーを返しては来ませんし、一度ログインして行いますし、そもそも先着順を競っているサーバなのでDDos攻撃にはなってないと思います。

回答No.2

No1さんに追加。物理的な距離。経路指定

takumiio
質問者

お礼

回答いただきありがとうございます。 私も、これも疑ってみたのですが、調べて見ると、1000Kmで5ミリ秒程度。 想像以上に速い気がしていまして、国内のサーバから、国内のサーバにアクセスすると、果たしてこれが大きな原因になりえるのか疑問を持っています。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

(相手のサイトまでの)回線速度。

takumiio
質問者

お礼

回答いただきありがとうございます。 ただ、書き忘れていましたが、やり取りするデータは、100KB程度しかありませんので、回線速度がそこまで大きなウェイトを占めますかね?

関連するQ&A