2011-11-10 2 views
1

私のJavaアプリケーションは、ソケットサーバーにメッセージ(マルチスレッド)を送信する必要があります。アプリケーションは約100〜200メッセージを1秒間に送信できます。Javaソケットクライアントのパターン

私はこれを行うためのより良いアプローチは何ですか?

  1. 単一のクライアントソケットを開き、この1つのソケットを通してすべてのスレッドからメッセージを送信します。 短所:接続障害時に再接続ロジックを処理する必要があり、再接続が進行中に多くのメッセージが失われる可能性があります。
  2. スレッドごとに新しいクライアントソケット接続を作成し、送信後に閉じます。 短所:ソケットを閉じても、ポートはTIME_WAITの期間まで待機します。

どちらがより実用的なアプローチですか?

答えて

3

私は3を提案します: スレッドごとにソケットを開き、(スレッドプールなどを介して)スレッドを再利用します。その後、スレッド内の再接続を処理するか、正しく処理して新しいスレッドを作成します。こうすることで、ブロックや同期の問題を回避できます。

+0

しかし、OSはちょうどこの権利ですか?固定数のポート(たとえば65000)を持ち、このプールからのポートを再利用します。私はマイクロレベルで同じことを実装する必要がありますか? – Dunxton

+0

OSオープンのニュースソケットを持っているので、既存のものを保有して再利用することが最善です(サーバで新しいハンズフリーを開くという意味です) –

1

1秒あたりのメッセージ数は100〜200ほどありません。私はこれが高価なので毎回再接続しません。接続を再利用すると、はるかに高速になります。

メッセージを失うことが心配な場合は、一度に1つのメッセージを送信したり、受信したサーバーからの確認を待つことができます。この方法でも毎秒何千ものメッセージを送信できます。

+0

100-200プロセス、それぞれ3つの接続を生成します。接続は秒です。これらのNIOフレームワークは、apache MINAやJboss nettyのようなものはどうですか?彼らは助けるだろうか?再接続やスレッドの待機/ブロックができないため、私はプールに少し気をつけています。それは私が送るリアルタイムのデータでなければなりません。また、私はソケットクライアントだけを書くことができます。宛先は、データをバッチで読み取ることができません。 – Dunxton

+0

接続ごとに1つのメッセージを送信することは、非常に効率的ではありません。オーバーヘッドは、既存の接続を再利用する場合よりも1000倍以上高くなります。また、サーバーに大きな負担をかけます。あなたが気をつけなければ、リソースが足りなくなる可能性があります。実際に毎回再接続する必要がある場合は、実験を通じてこれを行うことができる限度を決定し、クライアントを一括してこの割合に制限する必要があります。サーバーを管理しているサーバーを誰にも納得させようとする方がよいでしょう。少なくとも、サーバーを停止した場合は、その旨を通知する必要があります。 –

関連する問題