0

スタンドアロン/ウェブベースのJavaアプリケーションを構築する予定です。それはすぐに何千もの要求を処理することができるはずです。リクエストメッセージはTCPポート6040などを介して送られます。クライアントからのメッセージを常に聞くための専用のスレッドがあります。メッセージがソケットから読み取られると、このスレッドは要求を処理するスレッドを生成します。したがって、基本的にリクエストごとに1つのスレッド。Javaでロバストなマルチスレッドスケーラブルアプリケーションを作成する際に考慮すべき問題は何ですか?

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

シナリオがはっきりしていることを希望します。簡単に言えば、堅牢なマルチスレッドのスケーラブルなアプリケーション(クリシェを使用する)を構築することです。次のように私の質問は以下のとおりです。

  1. 着信要求に耳を傾け、メインスレッドが要求ごとにスレッドを作成すべきか、それだけでスレッドプールから1を取る必要があります。私が頼んでいるのは、私のアプリケーションでThread SpawningまたはThread Poolingを使うべきかどうかです。
  2. スタンドアロンJavaアプリケーションをクラスタに展開することはできますか?
  3. Webアプリケーション(JBoss 7.1サーバーにデプロイされています)でデプロイして実行することをお勧めします。これは管理目的で開発する予定ですか、スタンドアロンアプリケーションであるべきですか?共有しない:
  4. は、一般的には、Javaアプリケーションを拡張する必要があることを保証するために、Java
+0

あなたがによって「クラブそれを」何を意味するのですか?でくださいあなたは平均rそれは同じマシン上で?または同じプロセスでですか?または、他の何か? – joshp

+0

web-app – HariShankar

+0

と一緒に同じサーバーインスタンスで実行する何回も何度も構築されているものを再構築しているのはなぜですか?既存の実装に欠けているものは何ですか? –

答えて

2

で堅牢なマルチスレッドスケーラブルなアプリケーションを構築しながら、検討すべき課題が何であるか、従うべき1つの単純なルールは基本的にあります状態。

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

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

+0

「国を共有しないでください」とはどういう意味ですか?スレッド間通信は避けてください。 – HariShankar

+1

@hari私は彼がスレッド間で変更可能なデータを共有することを避けることを意味すると信じています。 (または少なくともそれを最小限に抑えて慎重に管理する) –

+0

@PeterLawrey:ありがとう、私はそれを避ける予定だった。データベースはスレッドの状態を保持します。 – HariShankar

2

応答時間を節約するために要求が到着したときにスレッドを生成するのではなく、Threadpoolsの使用を検討してください。また、非ブロックIOを使用することもできます(New I/Oを使用すると、1つのスレッドが多数の接続を監視することができます)また、Steven Schlanskerが言ったこと:状態を共有しないでください!

0

実際には、生産性の観点からは、Jetty、Tomcatなどの既存のWebコンテナを再利用するほうがはるかに迅速になります。サーブレットAPIに従うと、ビジネスロジックを記述するだけでコンテナが並行処理されます。あなた。

これは、Webコンテナのパフォーマンスチューニングに時間がかかる。でも、大企業は、このようなGoogleのApp Engineのように、Tomcatの/突堤を選択してください。

+0

スタンドアロンのアプリなら一から構築する必要があります。私がTomcat/Jetty/JBossのようなWeb-COntainerにデプロイしている場合、Webコンテナが特定のポート(6040など)に対する要求のロードバランシングを処理するかどうかを知る必要があります。 – HariShankar

+1

はい、Webコンテナに展開すると、コンテナはすべてのワーカースレッド間のロードバランシングを処理します。基本的に、ほとんどのコンテナはhttp要求をタスクキュー/プールに置きます。ここで、すべてのワーカースレッドは前のタスクが完了した後に新しいタスクを選択できます。 –

関連する問題