2012-06-22 12 views
7

私は、マルチスレッドクライアントが毎秒サーバーの何千もの呼び出しを実行するクライアントとサーバーのペアで作業しています。最優先事項は、最小限の待ち時間を達成することです。スループットも高いはずです。クライアントとサーバーの両方がJavaで書かれているため、通信のセマンティクスは非常に単純です(put/get操作)。軽量で低遅延のJavaネットワークライブラリですか?

これらの要件に最適なJavaネットワークライブラリ/フレームワークは何ですか? Tomacat/Jettyのようなサーバーは重量があるようです。私はMINAやNettyについて考えていますが、これらの非同期ライブラリが重い作業負荷のもとで安定した低遅延を提供するかどうかはわかりません。

+0

あなたは「クライアントが何千もの呼び出しを実行する」と話しています。あなたは本当に* 1 *(またはごくわずかなクライアント)しか持っていませんか? Java nio(netty/mina)に基づくフレームワークは、非常に多くのクライアント(同時接続)を処理しているときに輝きますが、必ずしもこれらのクライアントが多くの呼び出しを実行するわけではありません。 tomcatはhttpを使用しますが、mina/nettyはtcpを直接使用する方が適しています。 – MartinK

+0

はい、いくつかのクライアントアプリケーションしかなく、各アプリケーションのスレッド数は比較的少ない(〜20)。したがって、接続の総数は極端に多くはありません。 – user1128016

+0

ほとんどすべてのノンブロッキングネットワークライブラリは、メッセージを処理するときに多くのゴミを生成します。 GC干渉があるとリアルタイムになることが非常に難しくなります。ごみゼロを生み出す[CoralReactor](http://www.coralblocks.com/index.php/category/coralreactor/)をご覧ください。 – rdalmeida

答えて

1

超高性能とスループットが必要な場合は、rawソケットを使用することをお勧めします(ソケットとServerSocketをチェックしてください - nioバージョンもあります)。これにより、HTTPやその他のプロトコルに含まれるオーバーヘッドが解放されます。

+2

SocketとServerSocketは 'rawソケット'ではありません。それらはTCPソケットです。 Rawソケットは純粋なJavaからは使用できませんが、 – EJP

2

フレームワーク​​を試すことをお勧めします。

2

同じマシンで通信したい場合は、サブマイクロ秒往復時間で1秒間に百万以上の持続メッセージをサポートできるようなものをJava Chronicle などと試すことができます。

マシン間の待ち時間を短くしたい場合は、ハードウェアを非常に慎重に調べる必要があります。商品ハードウェアの場合、往復の待ち時間は100マイクロ秒/秒になります。専門のハードウェアでは、20マイクロ秒に近づいています。

また、同じボックスで通信し、待ち時間を大幅に短縮できます。 ;)

2

Jocketもお試しください。 Java Chronicleといくつかの概念を共有していますが、標準のSocket実装を置き換えることを直接対象としています。

RTTレイテンシは、プロセス間のピンポンではマイクロ秒未満です。