2011-01-25 6 views
0

ネットワークを大量に使用する分散型Javaアプリケーションを作成していますが、それはという高速のである必要があります。私のJavaアプリケーションに適したネットワーキングソリューションを選択してください

ウィジェットというクラスがあるとしましょう。ウィジェットはクライアントサイド(ほとんどの場合Swingボックス)で作成されますが、接続されている他のすべてのクライアントの間でサーバーサイドと共有/分散を維持する必要があります。だから、私はウィジェットのインスタンスをシリアル化し、それらをサーバーに送り、サーバーがそれらを管理し、接続されているすべてのクライアントを関心のあるウィジェットの状態の変更で更新する必要があります(ウィジェットが作成され、他のクライアントによって理論的に "プルダウン"され、変更される可能性があります。

パフォーマンスは必須です。バイナリプロトコルでなければなりません。また、非ブロッキングソケットや、

私はRMI、NIO、Nettyを実現可能なソリューションと考えています。もしJavaネットワークを正しく理解すれば、RMIがNIOよりかなり遅いと思われます。一方、スケーラビリティ部門NIOは、より柔軟性としたがって、かなり複雑である。 Nettyは最高のドキュメンテーションを持っているようですが、NIOよりも遅くて、本当に必要なことができない可能性があります。

ウィジェットの配布に関しては、ネットワーク経由でウィジェットを送信する機能を探しています。どのプロトコルが使用されているかは気にしないでください。

誰でも気軽に意見を共有できますか?

ありがとうございます!

答えて

0

あなたはNettyに言及しました。私はそれを2番目にします。 Nettyの私の経験は素晴らしかったです。確かなドキュメントと柔軟性を備えた非常に効率的なライブラリです。

これはバイナリプロトコルで想像できることは何でもできますが、必要なものだけを処理するので、軽量です。それも非常にうまくいきます。私は、200〜300の同時クライアントに対して10k +要求/秒以上を維持する単純なジョブで、単一のサーバーを正常にテストしました。それはかなり標準的なラックサーバ上にありました。

学習曲線は少しありますが、javadocはそのハードルに対処するために私が見てきた最高のものです。プロジェクトは積極的に発展しており、プロジェクトの主導者は質問や欠陥に非常に敏感です。

編集:ウィジェットの高速転送のために、プロトコルバッファを調べることができます。これらは、ワイヤでオブジェクトをシリアライズ/デシリアライズするのにはかなり効率的です。

+0

ありがとう!私はそれを考慮に入れます - それらはかなり大きい数字です。また、配布されたWidgetオブジェクトを使用するネットワーキングアプリケーションであると言えば、「分散」というフレーズを正しく使用していますか?あるいは、「シリアライズされた」、「分散された」、または「ネットワーク化された」とは異なる意味を持っていますか?ありがとう! – Eugie

0

あなたはJiniJavaspacesを見ましたか?それはRMIなので、おそらく適切ではありません。しかし、空間ベースのパターンは、オブジェクトの配布、通知の受信、分散された方法での更新などのために非常に強力です。あなたは何かを手に入れて実行することができます。

+0

ブライアン、提案のおかげで - 私は今夜ジニーを見ていきます。 – Eugie

0

GoogleのProtocol BuffersApache Thriftの両方がこれらの基準を満たしています。

これらはデータのシリアル化のためのバイナリプロトコルであり、ウィジェットをネットワーク経由で渡すRPC APIを備えているため、ホイールを再作成する必要はありません。

2

まず、RMIとNIOはオレンジにリンゴです。代わりではないものを混ぜてはいけません。次に、パフォーマンスが本当に重要であることを確認します。どのようなパフォーマンス(スループット&のレイテンシが通常の最初の候補であるか、またはおそらくスペース効率)が含まれます。優れたソリューションでは、エンドポイント(CPU)のパフォーマンスではなく、ネットワークパフォーマンスによって制限される可能性が高いため、パフォーマンスの重要性を過大評価する可能性があります。

パフォーマンスが重要な場合は、jvm-serializersをご覧になり、実際のフォーマットのパフォーマンスを比較してください。 Java直列化は、たとえばRMIに使用されます。

ああ、btw、バイナリ形式を使用する必要はありません。これは一般的に難しい要件ではありません。テキストフォーマットは圧縮性が良く、デバッグ/トラブルシューティングが容易で、必要に応じて他のプラットフォームや言語で処理することができます。

+0

StaxMan - 入力いただきありがとうございます。 RMIとNIOの違いを理解するためには、何か基本的なものが欠けているようです。私が理解しているように、どちらもソケットベースです。 NIOではTCPやUDPの上に何かを実装することができますが、RMIはほとんどの場合、ネットワーク経由でシリアル化されたオブジェクトを転送するための独自のアプリケーション層プロトコルを持っているようです。しかし、これはちょうど2つの異なるソケットベースのプロトコルに沸騰しないのですか?私はここで何が欠けていますか? 「シリアライズされた」オブジェクトと「ネットワーク化された」オブジェクトという用語が同じものを暗示しない限り、... – Eugie

+0

NIOは、古いブロッキングI/O(「BIO」)の低レベルの代替品です。 NIOは、非ブロック的な方法でソケット(およびファイルなど)にアクセスすることができます。 NettyはNIOを使いやすくするライブラリです。また、RMIはTCPベースの送受信だけでなく、オブジェクトのシリアライゼーションやその他の関連部分の「ブラックボックス」を実装しています。 RMIでのシリアライゼーションには、任意のJavaオブジェクトからbyte []への完全なシリアライズとバックが含まれます。私はシリアライゼーションが他の文脈で他の意味を持っていると思いますか? – StaxMan

+0

だから基本的に、RMIは "あなたが必要とするすべて"を実装しており、断片を置き換えることは難しいです。 NIO(Nettyの有無にかかわらず)は、下位レベルのビルディングブロックです。 NIO(またはブロッキングI/O)で何十ものシリアル化スキームを使用できます。 RMIのアイデアが気に入ったら、Amazonの上級エンジニアが書いたRMIの置き換えDiRMI、http://sourceforge.net/projects/dirmi/を検討することができます。それは「RMIのように、ちょうど良い」というものであり、最もよく知られている既存のRMIの問題に取り組んでいます。 – StaxMan

関連する問題