2017-12-15 9 views
0

私たちが構築しているアプリケーションには、多数の同時ユーザーがいることが予想されます。 APIレイヤを構築するためにSpring MVCを評価しようとしています。Spring MVCノンブロッキングとブロッキングのパフォーマンスの違い

以下の2件のハンドラが書かれていた - 1つのブロックと別の非ブロッキング:

@RequestMapping("/nblocking") 
public DeferredResult<String> nonBlockingProcessing() { 
    DeferredResult<String> deferredResult = new DeferredResult<>(); 
    executionService.execute(new Runnable() { 
     @Override 
     public void run() { 
      deferredResult.setResult(fetcher.load()); 
     } 
    }); 

    return deferredResult; 
} 

@RequestMapping("/blocking") 
public String blockingProcessing() { 
    return fetcher.load(); 
} 

私たちは、3500人の同時ユーザーと各エンドポイントを打つ、JMeterを経由してテストを実行しました。ブロッキング呼び出しで

結果: enter image description here

非ブロッキング呼び出しでの結果:上記のコードで enter image description here

、fetcher.loadコールが(最大接続はに設定MySQLへDBクエリを作っています200)と最大サイズ(50)の接続プールを使用します。

全体的にスループットと平均時間は、非ブロッキング呼び出しの方が優れています。スループットをさらに向上させるために、他に何か改善すべき点や考慮すべき要素がありますか?

+0

「スループットをさらに向上させるために、他にどのような改善や要因があるのでしょうか?」 javaコードを最適化します。MySQLのクエリを最適化します。 MySQLの設定を最適化してください。 –

+0

'fetcher.load()'命令はどのくらいの時間を使いますか?私はそれが読み込みの問題であるかどうかを確認します –

答えて

0

1)あなたのサーバーは、サーバーが同期要求応答モデルではなく、非同期またはイベント駆動型モデルに基づいて、同期要求応答モデルあなたの結果によると

を使用しています。
Tomcat、Apache、Weblogicなどの場合、そしてJavaアプリケーションサーバーのほとんどがそうです。
このモデルでは、リクエスト数は一般に数十の同時リクエストに制限されています。
あなたのテストで17.000リクエストを実行しました。
これは、多くのリクエストが処理待ちになっていることを意味します。
要求の処理が異なると、サーバーがすでにいっぱいになっているため、パフォーマンスが向上しません。

2)新しい要求ごとのスレッド作成と応答としての非同期処理を返さなければならないため、コストもかかります。

実際、JVMはこの場合より多くのオブジェクトを作成してより多くのタスクを実行しなければならず、スレッド数が増えるにつれてより多くのスケジューリングタスクを実行する必要があります。

結論:あなたがマシン上でいくつかの利用可能なCPUスレッドを有しているので、サーバー側からの非同期処理は常に

を、パフォーマンスを改善しないかもしれないが、複数のスレッドによって実行されるタスクを分割すると、パフォーマンスを向上させるために理にかなっています。
あなたのケースで非常に多くのリクエストを実行するため、使用可能なCPUがありません。
パフォーマンスが向上しないため、複数のクライアントを「並列」で処理できるだけですが、前述のUCスケジューリングとオブジェクト作成のためにパフォーマンスが低下します。

あなたはなぜ、サーバ側からが非同期の方法は、同期方法として遅い、あなたのケースでを理解する必要があります。

+0

私はアプリケーションを配備するためにTomcat 8.5を使いました。戻り型としてDefferedResultを使用する場合、Springでは非同期サーブレット3.1を使用しませんか? – singhspk

関連する問題