web-dev-qa-db-ja.com

RMI対Webサービス。 Java2Javaリモーティングに最適なものは何ですか?

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

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

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

ありがとう

45
cretzel

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

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

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

33
Mario Ortegón

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

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

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

HTH、
マーティン

12
Martin Klinke

WSがRMIよりも有利なことの1つは、WSは通常ファイアウォールでブロックされないHTTPポート80/443で動作することです。背後で動作することができますNATなど。RMIには、クライアントがNATTEDの場合、RMIポートを開くことも機能しない可能性があります。データはSOAP/HTTPなので、デバッグ用のスニッフィングツールを介して簡単にキャプチャできます。RMIを介してこれを行う簡単な方法は知りません。RMIは非常に古く、最後にあまり注目されていません。 CORBAが大規模だった時代に遡り、両方のRMI CORBAは本当に時代遅れのテクノロジーです。最良のオプションはRESTスタイルのWebサービスです。

8
user507484

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

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

4
Steve Moyer

@Martin Klinke

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

私の知る限り、パフォーマンスの問題は、シリアライゼーションとデシリアライゼーション、つまりマーシャリングとデマーシャリングのプロセスで違いが生じることを知っています。データをコピーする方法についてです。値渡しまたは参照渡しのいずれかです。バイナリ形式は値渡しに対応しており、バイナリでオブジェクトをリモートサーバーにコピーすることを意味します。

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

送信するデータの種類に依存せず、送信するデータの種類に関係なく、マーシャリングとデマーシャリングのプロセスの一部になり、最後にバイナリで送信されますか?

乾杯ハッキー

2
hakkican

複雑な状態を維持する必要がある場合は、RMIの方が適切な場合があります。

2
sammyo

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

1
Fyodor Kupolov

Springの常識とSOA=の指数として、長年、Springのリモーティングをお勧めします。この種のサービスエクスポーターは、R​​MIのトリックを行います。

org.springframework.remoting.rmi.RmiServiceExporter

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

0
Steve O 1969