分散環境とネットワーク系API/クラスタリング技術 今後のJavaへの希望
# 今朝は早起きしたので日記書きまくってますが.さて.
WebServiceのように,最初から分散環境にあるシステム同士が連携する必要性を想定しているのは除いて考える.
システム性能を上げるための一般的手法には2つの軸が存在している.一つはスケールアップであり,もう一つはスケールアウト.スケールアップは,より高価で高性能なハードウェア/ソフトウェアを使うことによりシステム性能を上げる手法.スケールアウトは,複数のハードウェア/ソフトウェアを使って元のシステムをn重化することによって性能を上げる手法.
# ここでいう性能とはパフォーマンスや信頼性その他全て含むものとして考えている
スケールアップとスケールアウトを比べた場合,スケールアップは費用対コストが悪い.それだけの理由だがビジネス上は大きな問題なので,現在はスケールアウトが主流となっている.スケールアウトを採用した場合,Javaの世界で考えると,それは複数のJVMを用いるような,いわゆる分散環境を指すことになる.
Javaの世界はJVMによって完全にソフトウェア環境が仮想化されている.従って,C言語の世界で複数プロセスを用いたソフトウェアのように,ソケットや共有メモリを用いた連携といった手法は存在しない.
Javaではその代わりに,SocketAPIという仮想的なソケット環境が用意されている.またこれをベースにRMIがあり,OMGのCORBAがあり,現在なら最後にWebServiceがある.またHTTPベースでアクセス可能なServletとJSPがあり,RMIベースのJNDIやEJBがある.
なるほど確かにJavaは分散環境に対応するための基盤技術が整備されているようだ,とも見える.しかし今回JBossクラスタリングの検証をやってみて思ったのだが,Javaはまだまだ分散環境の基盤技術が完全とは言えない.
雑感だが,クラスタリングの要素の中で,JVMレベルで実装してしまった方が効率が良さそうな要素が例えば以下のようなものがある.
- オブジェクトのレプリケーション
- 分散同期制御
アプリケーションサーバーのクラスタリングでは,HttpSessionやStateful Session Beanのレプリケーションを行う必要がある.ここらへんは,JVMにオブジェクトのレプリケーションとして組み込んでしまってはどうだろうか.JNDIに対するHA-JNDIみたいにつくればいいんじゃないのかな.共有メモリのようなものでもいいんだけど,それだと単一障害点が残るので.
あとSynchronizedによるオブジェクトのロック制御だけど,これは今のところ単体JVMでしか有効ではない技術.クラスタリング環境でこれをミドルウェア・ロジックで制御させるのは,ちょっとパフォーマンスが悪い気がする.これもJVMに組み込んでしまったほうが良さそう.
# JVM間でレプリケーションしているオブジェクトの同期制御と、各ローカルなオブジェクトの分散同期制御、2通りあるね
JVMインスタンス同士の自動検知とかは,要らない気がする.JGroupsとかを見た限りでは現時点のもので上手く行ってると感じた.
〜以上〜
追記:
よく考えたら,Session Replicationを行うためには(コピー+分散同期制御)が必要だから,JBossやTomcatその他クラスターなJ2EEサーバはみんな分散同期制御を実装しているよね.となると,なんでSessionオブジェクトの分散同期制御は行えて,Entity Beanの分散同期制御は行えないのかと,疑問.