torutkのブログ

ソフトウェア・エンジニアのブログ

Javaにおける分散処理の通信実現手段

システム設計においては、ネットワークは常に信頼できず、また、通信には時間がかかるということを念頭に分散処理を設計することが肝要です。

ここで、信頼性のある通信を実現するには、どのような実現手段をとればよいかを考えてみます。

Javaでアプリケーションを記述する場合、アプリケーションから通信手段を利用することになるので、Javaから利用しやすい通信手段として候補に思いつくのは、

  • (1) UDPデータグラム
  • (2) TCPソケット
  • (3) SCTP
  • (4) RMI
  • (5) CORBA
  • (6) HTTP
  • (7) XML-RPC
  • (8) Java Messaging Service (メッセージング・ミドルウェア
  • (9) Enterprise Service Bus

があります。(レイヤーの低位から並べた)
FTP,E-mail等のデータ転送プロトコルSSL等のセキュリティ付加プロトコルSNMPJMXなどの管理系プロトコルRDBMSとの通信は除外

UDP/TCP/SCTP

Javaでは、Datagram、Soket、NIOなどのAPIが提供されています。(SCTPはJava SE 7から正式追加)
他の高位なプロトコルの基本となるものです。(例:HTTPはTCPを使って実現)
IPマルチキャストを利用したい場合、高位のプロトコルではIPマルチキャストを扱えるものがないので、UDPを使うことになります。

参考
  • Javaネットワークプログラミングの真髄

JavaUDP/TCPプログラミングを作成するなら必読。過去UDP/TCPを使ってプログラムを作ったときに苦労したことがきちんと書かれている(例:UDP/TCPのバッファーサイズ、TCPコネクションのバックログ、クローズ手順、など)。NIOについてもしっかり書かれています。

RMI/CORBA

別プロセス・別計算機のアプリケーションのオブジェクトのメソッドを、同一プロセス中のオブジェクトのメソッドを呼び出すかのごとく呼び出す仕組みです。しかし、ネットワークを介するための遅延、ネットワークの低信頼性の問題があり、呼び出し応答時間の考慮、エラー処理をしっかり作りこんでおかないと不安定なアプリケーションとなってしまいます。

HTTP

もともとはWebサーバに対する要求・応答プロトコルですが、ファイアウォールを通過させることもできるので、XML-RPCの下位に使われたりもしています。

XML-RPC

HTTPの上に、XMLでデータを流すようにしたプロトコルです。

JMS

もともとJavaとは別に、企業系システムでの通信に使用されていたメッセージ指向ミドルウェア(Message-Oriented Midleware:MOM)を、その製品に関わらずJavaから共通APIで利用できるよう標準化されたものです。送信相手と接続できないときもデータを蓄積しておき、接続可能になったときに送信する機能があり、信頼できないネットワーク上で信頼性ある通信を実現しています。

ESB

アプリケーション間をESBと呼ぶ共通バスで接続して連携できるようにするものです。ESBとアプリケーション間はいろいろなプロトコルで接続できるよう変換機能が充実しています。

ところで何を使うべきか

設計は、つねにトレードオフ(適材適所)ですから、唯一解はありません。
高位のプロトコルを使えば機能は豊富ですが、代償もあります。
低位のプロトコルを使えば最適な通信を実現できますが、開発要素が大きくなります。
どこでバランスを取るかが難しい・・・

また、一つのシステムで1種類だけというものでもなく、LAN内での通信、WAN経由の通信、モバイル環境の通信、などの通信経路の特性や、通信に対する遅延、スループット、セキュリティなどの特性に応じて通信手段を変えるということが必要です。

ということで、システム設計にあたっては、適材適所を選択できるだけの知識・経験が必要になってきます。設計するときになって初めて勉強する、ということでは適切な設計ができないといえます。普段からの研鑽が不可欠です。