0

スタンドアロン/Web ベースの Java アプリケーションを構築する予定です。一度に数千のリクエストを処理できる必要があります。リクエスト メッセージは、たとえば 6040 などの TCP ポートを介して受信されます。クライアントからのメッセージを常にリッスンするための専用スレッドがあります。メッセージがソケットから読み取られると、このスレッドはスレッドを生成してリクエストを処理します。したがって、基本的にはリクエストごとに 1 つのスレッドです。

リクエストの処理には、リモート データベースでのストアド プロシージャの呼び出し、ローカル データベースでの更新/挿入の実行、ログ記録など、多くのデータベース操作が含まれます。リクエストを処理した後、クライアントにレスポンスを送信する必要があります。

シナリオが明確であることを願っています。要するに、堅牢なマルチスレッドのスケーラブルなアプリケーションを構築したい (クリシェを使用するため)。私の質問は次のとおりです。

  1. 着信要求をリッスンするメイン スレッドは、要求ごとにスレッドを生成するか、スレッド プールから 1 つ取得する必要があります。私が求めているのは、アプリケーションでスレッド スポーニングまたはスレッド プーリングを使用する必要があるかということです。
  2. スタンドアロン Java アプリケーションをクラスターにデプロイすることはできますか?
  3. 管理目的で開発する予定の Web アプリケーション (JBoss 7.1 サーバーにデプロイ) でデプロイして実行するのは良い考えですか、それともスタンドアロン アプリケーションにする必要がありますか?
  4. 一般に、Java で堅牢なマルチスレッド スケーラブルなアプリケーションを構築する際に考慮すべき問題は何ですか?
4

3 に答える 3

2

Javaアプリケーションを確実に拡張するには、基本的に1つの簡単なルールに従う必要があります。状態を共有しないでください。

すべての状態は、スレッドまたはバッキングデータストアに対してローカルである必要があります。これにより、完全に独立したアプリケーションの無制限のコピーを(同じマシン上にあるかどうかに関係なく)起動し、前面にある単純なロードバランサーを使用できるようになります。

スレッドの質問に具体的に答えるには、ほとんどの場合、適切に構成されたスレッドプールを使用することをお勧めします。リクエストにインラインでスレッドを生成するオーバーヘッドを回避し、リソースの競合/枯渇を回避するために合理的な制限を構成できます。

于 2012-05-06T16:57:36.340 に答える
2

応答時間を節約するために、要求が到着したときにスレッドを生成するのではなく、スレッドプールを使用することを検討してください。さらに、ノンブロッキングIOを使用することもできます(新しいI / Oをチェックして、単一のスレッドで多くの接続を監視します。また、Steven Schlanskerが言ったこと:状態を共有しないでください!

于 2012-05-06T17:00:14.343 に答える
0

本当にゼロから構築する価値があるかどうかはわかりません。生産性の観点からは、Jetty、Tomcat などの既存の Web コンテナーを再利用する方がはるかに高速です。サーブレット API に従う場合は、ビジネス ロジックを記述するだけで済み、コンテナーが並行処理を処理します。

Web コンテナーのパフォーマンスを調整するには、多くの時間がかかります。大企業でさえ、Google の App Engine などの Tomcat/Jetty を選択しています。

于 2012-05-07T09:43:54.823 に答える