システム設計においては、ネットワークは常に信頼できず、また、通信には時間がかかるということを念頭に分散処理を設計することが肝要です。
ここで、信頼性のある通信を実現するには、どのような実現手段をとればよいかを考えてみます。
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等のセキュリティ付加プロトコル、SNMPやJMXなどの管理系プロトコル、RDBMSとの通信は除外
UDP/TCP/SCTP
Javaでは、Datagram、Soket、NIOなどのAPIが提供されています。(SCTPはJava SE 7から正式追加)
他の高位なプロトコルの基本となるものです。(例:HTTPはTCPを使って実現)
IPマルチキャストを利用したい場合、高位のプロトコルではIPマルチキャストを扱えるものがないので、UDPを使うことになります。
RMI/CORBA
別プロセス・別計算機のアプリケーションのオブジェクトのメソッドを、同一プロセス中のオブジェクトのメソッドを呼び出すかのごとく呼び出す仕組みです。しかし、ネットワークを介するための遅延、ネットワークの低信頼性の問題があり、呼び出し応答時間の考慮、エラー処理をしっかり作りこんでおかないと不安定なアプリケーションとなってしまいます。
JMS
もともとJavaとは別に、企業系システムでの通信に使用されていたメッセージ指向ミドルウェア(Message-Oriented Midleware:MOM)を、その製品に関わらずJavaから共通APIで利用できるよう標準化されたものです。送信相手と接続できないときもデータを蓄積しておき、接続可能になったときに送信する機能があり、信頼できないネットワーク上で信頼性ある通信を実現しています。
ESB
アプリケーション間をESBと呼ぶ共通バスで接続して連携できるようにするものです。ESBとアプリケーション間はいろいろなプロトコルで接続できるよう変換機能が充実しています。
ところで何を使うべきか
設計は、つねにトレードオフ(適材適所)ですから、唯一解はありません。
高位のプロトコルを使えば機能は豊富ですが、代償もあります。
低位のプロトコルを使えば最適な通信を実現できますが、開発要素が大きくなります。
どこでバランスを取るかが難しい・・・
また、一つのシステムで1種類だけというものでもなく、LAN内での通信、WAN経由の通信、モバイル環境の通信、などの通信経路の特性や、通信に対する遅延、スループット、セキュリティなどの特性に応じて通信手段を変えるということが必要です。
ということで、システム設計にあたっては、適材適所を選択できるだけの知識・経験が必要になってきます。設計するときになって初めて勉強する、ということでは適切な設計ができないといえます。普段からの研鑽が不可欠です。