2009-11-28 13 views
7

私は、サードパーティのWebサイトから情報を取得するクラスライブラリに取り組んでいます。設定された時間内にリクエストが多すぎると(〜0.5秒)、アクセスされているWebサイトが応答を停止します。ウェブリクエストを抑制する責任は誰にありますか?

私のライブラリのパブリックメソッドは、Webサーバー上のファイルに直接関連しています。つまり、メソッドが呼び出されるたびにHttpWebRequestが作成され、サーバーに送信されます。すべてがうまくいくと、XMLファイルが呼び出し元に返されます。ただし、これが0.5秒未満で2番目のWeb要求である場合、の要求はタイムアウトになります。

私のジレンマは、リクエストスロットルをどのように処理するべきかにあります。明らかに、私は、呼び出し側が応答を待つことを避けたいと思っています。特に、要求がタイムアウトすることを完全に確信している場合は特にそうです。

私のライブラリが作成したWeb要求を待ち行列に入れてスロットルするのが理にかなっていますか?クライアントがAPI呼び出しの間に十分長く待たなければライブラリは単に例外をスローするべきですか?

+0

ジャスティン。アクセスしているWebサイトか、サードパーティのWebサイトです。私の「良い市民」のコメントはそれが第三者であることに基づいていましたが、他の人はあなたのサイトを推測したようです。 – Andiih

+0

サイトは確かに第三者のサイトです。私はそれを指定しなかったことを指摘してくれてありがとう。私は明確にするために私の質問を更新しました。 –

答えて

6

ライブラリの概念は、クライアントコードをできるだけ心配する必要がないようにすることです。したがって、私は要求を待ち行列に入れ、タイムリーに結果を返すためにライブラリの仕事にします。理想的な世界では、クライアントコードがUIをブロックするのではなく非同期で動作できるように、コールバックまたはデリゲートモデルを使用します。また、キューをスキップするオプションを提供することもできます(また、あまりにも早く動作する場合は失敗する)可能性があり、場合によってはキューモデル内で優先順位を提供することもできます。

私はまた、良い市民であることをデフォルトにし、図書館のデフォルトの操作がデータ提供者の条件に従うことは、図書館の作者の責任であると考えています。

+0

+1 "良い市民"の部分です。私はこの問題をデータプロバイダの観点から見るのを忘れていました。 しかし、キューに入れることができる要求の数に何らかの制限を課すことなく、結果がタイムリーに提供されることをどうすれば保証できますか? –

+1

キューのサイズを問い合わせるメソッドを提供し、おそらくライブラリによって実装されたタイムアウトを持つ限り、保証する必要はないと思います。 – Andiih

+0

しかし、同時に、単にそれを起こさせることがより純粋ではないでしょうか?要求は拒否されますが、彼らはあまりにも速くそれをやっていることを単に伝えますか?さらに、実際のサイトの実装では、ある日、上限を上げる可能性があり、ライブラリを独裁者ではなくメッセンジャーにすることもできます。 – BigOmega

2

これはWebサーバーの責任です。クリティカルな負荷はハードウェア、ネットワーク帯域幅などアプリケーションの制御範囲外の多くに依存するため、それを処理しようとする必要はありません。 IISは、さまざまな構成オプションに基づいてトラフィックを抑制できます。

+1

あなたのライブラリが0.5秒間に1つの応答しか受け付けないウェブサービスにアクセスすることが、それがその使用の条件である場合、それはあなたが気にするべきことですか? – Andiih

+0

1秒あたり2リクエストしか許可しない理由のビジネス上の理由がある場合(データが頻繁に更新されず、クライアントに新しいものが表示されない可能性があるため)、そのスロットルをあなたが望む負荷を制限することができます。これは、アプリケーションが実行できる絶対的なものです。 – cdonner

+0

アクセスされているWebサイトはサードパーティのサイトであるため、残念ながらIISの設定は制御できません。 –

3

私は2つの独立したシステムを扱っており、どちらも過度の負荷から自分自身を守るための対策を講じるべきだと言いたいと思います。 Webサーバーは着信接続を拒否し、クライアント・ライブラリーは、外部サービスの応答が遅い、または応答が遅い要求を減らすための手順を実行する必要があります。クライアント上でこれを処理するための一般的なパターンは、呼び出しを外部サービスにラップし、失敗後一定期間高速で失敗する 'サーキットブレーカ'です。

+0

リクエストが拒否された場合は、単に無視されるのではなく、うまくいくでしょう。しかし、私に回路遮断器パターンを指摘してくれてありがとう。私は確かにそれが有用になる時を見ることができます。 –

1

どのようなクライアントですか?これはインタラクティブなクライアントですか、例えば:GUIベースのアプリですか?

この場合、Webブラウザシナリオと同じにして、タイムアウトサーフェスを呼び出し元に任せることができます。また、このWebサーバーが要求を抑制していることがわかっている場合は、クライアントに再試行の前に一定の時間待機する必要があることを伝えることができます。このようにして、クライアントは要求を再発行し続けることはなく、最初のタイムアウトが発生したときに、要求をあまりに速く発行するのは無駄だと分かります。

+0

クライアントはクラスライブラリであり、GUIアプリケーションで使用できます。私のメソッドが頻繁に呼び出されていることを呼び出し側に通知するために例外を使用することは、私が検討している解決策です。しかし、頻繁に呼び出すとタイムアウトが発生することはわかっているので、それは本当に例外的な状況ですか? –

+0

あなたは、「あまりにも多くのリクエスト」が一定の時間(0.5s)で送信された場合、サーバーがリクエストを抑制すると述べました。 「あまりにも多くのリクエスト」はどれくらいですか? これについて考えると、0.5秒が限界である場合、GUIベースのクライアントがこれを超過するのは本当に難しいかもしれません。 また、GUIライブラリを設計して、「N」非同期要求が未処理で、サーバーを決して壊さないようにすることができます。私はN = 2に制限します(ユーザーに合わせて設定可能にしてください)。デリゲートを使用してクライアントの進行状況通知を行う仕組みがあります。 – feroze

関連する問題