RMI vs.ウェブサービス。Java2Java リモーティングには何が最適ですか?

StackOverflow https://stackoverflow.com/questions/100993

質問

私は Web サービスと RMI の両方に慣れていません。異なる Web アプリケーションがすべて Java で書かれている場合、つまり、異なるプログラミング言語が問題にならない場合、異なる Web アプリケーション間でリモート処理を行うにはどちらがより良い方法なのか疑問に思っています。 WSの利点)。

Web サービスを使用するとパフォーマンスのオーバーヘッドがあると思う一方で (それを証明する数字を持っている人はいますか?)、一方で、Web サービスはより疎結合であり、次のような用途に使用できるように思えます。よりサービス指向アーキテクチャ (SOA) を実装します (RMI では不可能ですよね?)。

かなり一般的な質問ですが、いかがでしょうか。

ありがとう

役に立ちましたか?

解決

Web サービスでは、疎結合アーキテクチャが可能です。RMI では、クラス定義がすべてのアプリケーション インスタンスで同期していることを確認する必要があります。つまり、1 つだけ変更された場合でも、常にすべてのクラス定義を同時にデプロイする必要があります (必ずしもそうである必要はありません)。シリアル UUID などの理由で頻繁に必要になります)

また、スケーラビリティがあまり高くないため、ロード バランサを使用する場合に問題になる可能性があります。

私の考えでは、RMI は、インターネット関連ではないものの、分離する必要がある小規模なローカル アプリケーションに最適です。私は電子通信を処理する Java アプリケーションを作成するためにこれを使用しましたが、その結果には非常に満足していました。より複雑な展開が必要で、インターネット経由で動作する他のアプリケーションの場合は、むしろ Web サービスを使用します。

他のヒント

Web サービスを使用するか、より「ネイティブ」なアプローチを使用するかは、環境によっても異なります。プロキシまたは企業ファイアウォールを通過する必要がある場合、Web サービスは HTTP のみに依存しているため、機能する可能性が高くなります。RMI では、アプリケーション用に別のポートを開く必要がありますが、環境によっては (技術的にではありませんが) 難しい場合があります...

この問題が問題ではないことがわかっている場合は、RMI の使用を検討してください。SOA は、優れたサービス設計ほどテクノロジーには依存しません。EJB コンテナがある場合、本当に必要であれば、RMI 経由でセッション Bean を呼び出し、さらに Web サービスとして公開することができます。

パフォーマンスは、交換する予定のデータによって異なります。複雑なオブジェクト ネットをあるアプリケーションから別のアプリケーションに送信する場合は、(通常は) バイナリ形式で転送されるため、RMI を使用した方がおそらく高速です。いずれにしても、何らかのテキスト/XML コンテンツがある場合は、(通信のために) 何も変換する必要がないため、Web サービスは同等かそれ以上の速度になる可能性があります。

HTH、
マーティン

RMI よりも WS の方が有利な点の 1 つは、WS が通常ファイアウォールでブロックされない HTTP ポート 80/443 上で動作し、NAT などの背後で動作できることです。RMI には非常に複雑な基盤となるネットワーク プロトコルがあり、RMI ポートを開く必要があり、クライアントが NATTED の場合は機能しない可能性があります。次に、RMI では slef を JAVA-JAVA 通信に制限しますが、Webservies ではそのような制限はありません。データは SOAP/HTTP であるため、ネットワーク経由で Web サービスをデバッグする方がはるかに簡単で、デバッグ用のスニッフィング ツールを使用して簡単にキャプチャできます。RMI でこれを行う簡単な方法はわかりません。さらに、RMI は非常に古いもので、ここ数年はあまり注目されていません。CORBA が大きかった時代にはそれが流行っていましたが、どちらの RMI CORBA も本当に時代遅れのテクノロジです。最良のオプションは REST スタイルの Web サービスです。

RMI と Web サービスに関する私の経験は、上記の推測を反映しています。一般に、RMI のパフォーマンスは Web サービスをはるかに上回っていますが、Web サービスにはインターフェイスの仕様が明示的に記載されています。

これらのプロトコルはいずれも使用できないことに注意してください。 必要 両側のアプリケーションが Java であること。インターフェイスを実装する外部パートナーが 1 人以上いる場合は Web サービスを使用する傾向がありますが、接続の両端を制御している場合は RMI を使用します。

複雑な状態を維持する必要がある場合は、RMI の方が良いかもしれません。

@マーティン・クリンケ

「パフォーマンスは、交換する予定のデータによって異なります。複雑なオブジェクト ネットをあるアプリケーションから別のアプリケーションに送信する場合は、(通常は) バイナリ形式で転送されるため、RMI を使用した方がおそらく高速です。いずれにしても、何らかのテキスト/XML コンテンツがある場合は、(通信のために) 何も変換する必要がないため、Web サービスは同等かそれ以上の速度になる可能性があります。」

私が知っている限り、パフォーマンスの問題は、つまり、マーシャリングデマーシュリングプロセスのシリアル化の否定化中に違いをもたらします。これらの用語の両方が分散プログラミングで同じbtwであるかどうかはわかりません。それはあなたがデータをコピーする方法についてです。それは値で渡されるか、参照によって渡されます。バイナリ形式は、バイナリのリモートサーバーにオブジェクトをコピーすることを意味します。

マーシャリング-デマーシャリングまたはシリアル化-逆シリアル化の点で、バイナリ形式で送信することとテキスト/XMLコンテンツで送信することの違いは何ですか?

推測です。送信するデータの種類には依存しません。送信するデータの種類が何であっても、それはマーシャリング / デマーシャリング プロセスの一部となり、最後にはバイナリで送信されますよね?

乾杯hakki

Spring Remoting についてはどうでしょうか。REST のような HTTP プロトコルと RMI のバイナリ形式を組み合わせたものです。私にとっては完璧に機能します。

Spring の偏屈者であり、長年にわたる SOA の擁護者として、私は Spring リモート処理をお勧めします。このフレーバーのサービス エクスポータは RMI に効果を発揮します。

org.springframework.remoting.rmi.RmiServiceExporter

もちろん他の交通手段も利用可能です。インターフェイス (エンドポイント) と DTO を適切にバージョン管理し、シリアル化 UUID を適切に管理すれば、シリアル化は非常に管理しやすくなります。私たちはインターフェースやオブジェクトに「Alpha」、「Bravo」を付加し、必要に応じてインクリメント、デクリメント、再発明します。また、シリアル化 UUID を 1 に修正し、変更が追加のみであることを確認します。それ以外の場合は、たとえば「Bravo」から「Charlie」に移行します。すべてエンタープライズ設定で管理可能です。

Spring Remoting (HTTP Invoker のことだと思います) の場合、議論できる場合は、両方の側で Spring を使用する必要があります。

Java 間アプリケーションの場合、RMI は適切なソリューションです。クライアントが制御下にない場合、または別のプラットフォームに移動する可能性がある場合は、Java 間通信用の JAX-RPC または JAX-WS は避けてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top