47

私はWebサービスとRMIの両方に不慣れであり、これらのアプリケーションがすべてJavaで記述されている場合、つまり異なるプログラミング言語が重要でない場合、異なるWebアプリケーション間でリモーティングを行うためのより良い方法はどちらかと思います(これはWSの利点)。

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

これはかなり一般的な質問ですが、あなたの意見は何ですか?

ありがとう

4

9 に答える 9

34

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

また、スケーラブルではありません。これは、ロードバランサーが必要な場合に問題になる可能性があります。

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

于 2008-09-19T10:56:20.463 に答える
13

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

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

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

HTH、
マーティン

于 2008-09-19T10:48:38.173 に答える
11

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 サービスです。

于 2010-11-14T17:25:57.917 に答える
5

RMIとWebサービスに関する私の経験は、上記の推測を反映しています。一般に、通信要件が複雑なオブジェクトに対するものである場合、RMIのパフォーマンスはWebサービスを上回ります。JEEインターフェース仕様は、Webサービスに対して明示的に指定する必要があります。

Webサービスは相互運用可能ですが、RMIは相互運用可能ではないことに注意してください(クライアントとサーバーのテクノロジに関して)。インターフェイスを実装している外部パートナーが1つ以上いる場合は、Webサービスを使用する傾向がありますが、接続の両端を制御している場合はRMIを使用します。

于 2008-09-19T10:43:34.473 に答える
2

@マーティン・クリンケ

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

私が知る限り、パフォーマンスの問題はシリアライゼーション - デシリアライゼーション、つまりマーシャリング - デマーシャリング プロセス中に違いをもたらします。これらの用語が両方とも同じであるかどうかはわかりませんが、分散プログラミングでは、同じ JVM で発生するプロセスについて話しているのではありません。データをコピーする方法についてです。値渡しまたは参照渡しのいずれかです。バイナリ形式は値渡しに対応しています。つまり、オブジェクトをバイナリでリモート サーバーにコピーします。

マーシャリング-デマーシャリングまたはシリアライゼーション-デシリアライゼーションに関して、バイナリ形式で送信することとテキスト/xmlコンテンツで送信することの違いは何ですか?

私はただ推測しています.送信するデータの種類には依存しません.送信するデータタイプは何であれ、マーシャリング-デマーシャリングプロセスの一部になり、最後にバイナリで送信されますよね?

乾杯ハッキ

于 2013-04-23T10:11:06.610 に答える
2

複雑な状態を維持する必要がある場合は、RMI の方が適している可能性があります。

于 2008-10-08T14:08:54.260 に答える
1

Spring の信奉者であり、長年 SOA の支持者である私は、Spring のリモート処理をお勧めします。このフレーバーのサービス エクスポーターは、R​​MI のトリックを実行します。

org.springframework.remoting.rmi.RmiServiceExporter

もちろん、その他の交通機関もご利用いただけます。インターフェイス (エンドポイント) と DTO を適切にバージョン管理し、シリアル化 UUID を適切に管理すれば、シリアル化は非常に扱いやすくなります。インターフェイスとオブジェクトに「Alpha」、「Bravo」を後置し、必要に応じてインクリメント、デクリメント、および再発明します。また、シリアライゼーション UUID を 1 に修正し、変更が追加のみであることを確認します。それ以外の場合は、たとえば「ブラボー」から「チャーリー」に移動します。エンタープライズ セットアップですべて管理可能。

于 2016-04-12T12:58:26.760 に答える
1

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

于 2008-12-05T10:19:54.060 に答える
-1

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

Java から Java へのアプリケーションの場合、RMI は優れたソリューションです。クライアントが制御下にない場合、または別のプラットフォームに移動する可能性がある場合は、Java から Java への通信に JAX-RPC または JAX-WS を使用しないでください。

于 2009-04-20T11:12:27.027 に答える