何が@カヤマンは言った:)
時間の要件は何ですか?あなたはX秒で230をすべて正常に実行する必要がありますか? Webサーバーはデフォルトのタイムアウトを制御しますか?すべてのリクエストは200
になる必要がありますか?単一のリクエストが失敗した場合はどうなりますか?成功するまで再試行しなければなりませんか?いくつかのパーセンテージが失敗した場合、他のすべてのリクエストを無効にする必要がありますか?バックオフはどうですか?
リクエストを並行して実行できない場合は、何らかの並行コードが残っています。並行コードは同期コードより難しい。推論する必要のあるコードパスのバリエーションは非常に多く、同期メモリアクセスまたはw/eがあります。
Webリクエストのコンテキストでリクエストを実行する必要がある場合は、通常、並行性(スレッドプール)を設定された量に制限することをお勧めします。
ハードコードされている230が設定されている場合は、それでもなお大きすぎる可能性があります。これが公開されているエンドポイントであれば、誰かがあなたのサーバーに対して10,000件の同時リクエストを開始するのを止めることはできません。230件のURLに対して同時に2,300,000件のリクエストを処理できる場合は!!!!!!!!このため、すべてのリソースには何らかの種類の正常なバインディングが必要です。あなたがデータベースからURLを引っ張って、任意のユーザーが無制限で良くないURLを追加する可能性があります。
これを行う簡単な方法の1つは、スレッドプールを使用して並行性を制限することです。
このアーキテクチャは、境界のあるスレッドプールとキューで構成できます。各Webリクエストが入ってくると、URLがエンキューされ、スレッドプールがそれらを処理できます。戻り値が必要な場合は、戻り値Queueを持つことができます。これについて私が気に入っているのは、プロデューサ(Webリクエストハンドラ)とコンシューマ(スレッドプール)の両方が同期スタイルで記述されており、スレッドプールでフェッチャを実行することによってランタイムによって同時性が達成されるということです。
Kayamanは、これに対処するために一般的に使用されている方法に触れました。Web要求のコンテキストから長時間実行されるプロセスを取り除きます。このアーキテクチャは、内部スレッドプールやキューとよく似ていますが、プロセス間になります。キューは外部のプロセス・ジョブ/メッセージ・キューになり、コンシューマーはそれを引き継ぎます。その後、Web要求は230のメッセージを出し、クライアントに戻ります。そして、非同期的には、コンシューマーはキューから引き続きリクエストを行います。
URL以外で変化しない場合は、ループ内で記述できます。提供する必要があるのは、呼び出す230のURLすべてを持つArrayです。 – kism3t
1回のリクエストで230のWebサービスコールを作成する必要はありますか? – Kayaman
こんにちはkism3t ...あなたは正しい、URLだけが異なります。答えを広げてください。現在、私のコードはループごとに実行されており、各Webサービスを1つずつ呼び出しています。このアプローチの問題は、時間がかかりすぎるということです。 – user2318704