2017-04-12 16 views
1

あまりにも先に進む前に、私はデュー・ディリジェンスを行い、Webでアドバイス/回答を検索したことを保証したいと思います。特に、私は以下の記事を見て:上記の記事で複数の異なるWebサービスをWebアプリケーションから並列に呼び出す

Calling Different Webservices in parallel from Webapp

を、あなたはuser1669664をしていることがわかります「約15異なるwebserivceはすべて1つのメソッドから呼び出しを行います。」

私はmatt bによって提供された最良の答えを読んでいます。この回答は、基本的には、それぞれ異なるWebサービス呼び出しに対してCallableを記述する必要があります。

事は、私ははるかに大きな規模で同様の問題を持っている...

である - 私は約230 Webサービスの呼び出しを行う必要があります。

アドバイスや提案をいただき、ありがとうございます。私は230 Callables ...を書こうとは思わない!

ありがとうございます。

+0

URL以外で変化しない場合は、ループ内で記述できます。提供する必要があるのは、呼び出す230のURLすべてを持つArrayです。 – kism3t

+0

1回のリクエストで230のWebサービスコールを作成する必要はありますか? – Kayaman

+0

こんにちはkism3t ...あなたは正しい、URLだけが異なります。答えを広げてください。現在、私のコードはループごとに実行されており、各Webサービスを1つずつ呼び出しています。このアプローチの問題は、時間がかかりすぎるということです。 – user2318704

答えて

1

何が@カヤマンは言った:)

時間の要件は何ですか?あなたは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のメッセージを出し、クライアントに戻ります。そして、非同期的には、コンシューマーはキューから引き続きリクエストを行います。

+0

うわー...そのような詳細な答え、dm03514ありがとう!以前のコメントで述べたように、私は私ができることに非常に拘束されています...悲しいことに、私はキューを使うことはできません。しかし、私はWebサーバーを見て、おそらくデフォルトのタイムアウトで何かをやっているという考えが好きです。 – user2318704

+0

Webリクエストのコンテキストで、内部的にキューを使用できるはずです。 http://stackoverflow.com/a/2332581/594589 – dm03514

関連する問題