web-dev-qa-db-ja.com

Webサービスへの複数の呼び出しを処理する方法?

私はREST webserviceを得ました、そしてそれはのような単純なメソッドを持っています;

public void processItem(Item item);

問題はprocessItemメソッドが1分近く完了するのに時間がかかりすぎることであり、短時間で複数の呼び出しが発生する可能性があります。

これらのリクエストを効率的に処理するにはどうすればよいですか?

Webサービスはすべての要求に対して新しいスレッドを作成し、私の知る限り、スレッドの制限を超えると新しい要求を保持します。しかし、私はクライアントがタイムアウト例外を取得することを望んでいません。

LinkedBlockingQueueのようなものを使用する必要がありますか、それとも他の効率的な方法はありますか?

LinkedBlockingQueue<Item> items = new LinkedBlockingQueue();

public void processItem(Item item){
    items.put(item);
}
3
hellzone

あなたの当面の問題は、より良いウェブサーバーで修正するか、非同期モデルで動作するようにAPIを再構成して、スレッドを消費しないようにすることができます。

ただし、長いリクエストを処理する場合は、無期限の遅延に対処できるキューモデルに切り替える必要があります。

インフラストラクチャによっては、クライアントがキューに直接投稿し、応答キューをリッスンする場合があります。

または、HTTP APIへの投稿を続行し、別のワーカーアプリが後で処理できるようにジョブを保存し、クライアントが更新をポーリングできるようにクエリAPIを提供することもできます。

2
Ewan