公開[小山博史,株式会社ガリレオ]Javaはネットワークを利用した分散処理にも強いJavaはネットワークプログラミング向けのjava.netパッケージが標準で備わっていることからも分かるように、もともとネットワークを強く意識した言語仕様となっています。そのため筆者は、「Javaはネットワークを利用した分散処理にも強い」というイメージを持っています。前回の「GoogleのMapReduceアルゴリズムをJavaで理解する」で説明した、分散処理技術で最近注目を浴びているMapReduceもJavaによる実装があります。Hadoopプロジェクトで開発されているものです。Luceneのサブプロジェクトでしたが、2008年1月23日にApacheのトッププロジェクトになっています。Hadoopの使い方やソースコード例を解説する前に、今回はJavaでも使える分散処理技術やWebサービスについて簡単にお話しします。Javaでも使える分散処理技術はこんなにあるJavaでは、言語仕様にマルチスレッド向けクラスライブラリや、ネットワーク用クラスライブラリが含まれていたので、登場した当時から分散処理のプログラムを実装しやすかった覚えがあります。1.0.2のころはjava.net.Socketクラスやjava.net.ServerSocketクラスをよく使って、C/S(クライアント/サーバ)モデルのプログラムを作成していたものです。■ソケット通信によるC/SモデルC/Sモデルでは、「負荷の高い計算などをサーバ側で実行して、クライアント側はリクエストをサーバに出して、結果を受け取って表示したりする機能を持つ」という役割分担をします。サーバはサービスを提供するもの、クライアントはサービスを利用するもの、という関係にあります。kwoutC/Sシステムを作成するには、システム間でデータをやりとりするための通信プロトコルを設計して実装をする必要があります。Webシステムでは、HTTPを使って通信をしますが、独自システムを開発する場合で特別なプロトコルが必要な場合は、自分で設計をすることになるので、結構大変です。いえ、JavaではBSD系UNIXのソケット通信をサポートするクラスとして、java.net.Socketとjava.net.ServerSocketがあったので、当時としては随分楽にプログラムを作成できました。Serverへ画面描画を依頼しています。Serverは各自のデスクトップを表示するコンピュータで動作させて、アプリケーションはパワフルなマシンにインストールしておいて、それを呼び出して使います。Serverはサーバマシンへインストールして動作させるものだ」と勘違いしやすいので気を付けましょう。ちなみにWindowsでは、似たような機能を実装したものとして「リモートデスクトップ」があります。XPやVistaの安価バージョンでは使えませんが、便利なので筆者は使えるバージョンのWindowsを購入して使っています。RMI」ソケット通信が簡単に実装できるというのはよかったのですが、オブジェクト指向プログラマーからすると、「通信プロトコルを設計してネットワークの向こうにあるオブジェクトを操作できるようにする」というのが面倒に感じられます。Invocation)つまり、java.rmiパッケージが提供されるようになりました。SE)でもRMIは使用できます。RMIを使うと、Javaでリモートオブジェクトのメソッドを呼び出して利用できます。通信手順などを考える必要はなく、普通にオブジェクトのメソッドを呼び出すようにプログラムを記述できるので、非常に簡単にプログラミングができます。o.method(x);」のように記述できるわけです。RMIを使うためには、もちろんこれだけではなく、いろいろと準備が必要ですが、環境さえ用意できれば、このようにプログラム中で簡単に使えるようになります。RMIのほかにもあります。Architecture)などです。CORBAを使うと、異なるプログラミング言語で実装されたソフトウェアがさまざまなコンピュータ上で動作している環境で、ソフトウェアコンポーネントを相互利用できます。Protocol)というプロトコルを使うのですが、実際のネットワーク運用環境では、このプロトコルはファイアウォールを通過できないように設定されていることが多いはずです。HTTPを閉じているネットワークはほとんどないと思いますが、IIOPを閉じているネットワークは非常に多いのではないでしょうか。このため、IIOPを利用してインターネット上で稼働する分散システムを作るということは少ないのです。kwoutちなみに、Javaには関係するパッケージとして、javax.rmi.CORBAパッケージやorg.omg.CORBAパッケージがあったりします。Call)があります。これはその名のとおり、「リモートのプロシージャを呼び出して利用する」、つまり「ネットワーク上にある別のマシンで処理を実行して結果を得る」というものです。RPCでは、いわゆるオブジェクト指向の「オブジェクト」という概念はありません。f(x);」のように書くことができます。RMIと同様にいろいろ準備が必要です。RPCといえば、「XML-RPC」というものもあります。Page」によると、データエンコードにXMLを、通信プロトコルにHTTPを使ったRPCが、XML-RPCになります。「f(1)」のような処理を呼び出すには、下記のXMLをHTTPのPOSTメソッドを使ってWebサーバへ投げます。XML-RPC」などを使います。1.2からは固有名詞)があります。SOAPは基本的に、状態を持たない、一方向のメッセージ交換用のプロトコルです。Webサービスにおけるメッセージ交換で使われています。通信をするアプリケーションにはSOAPを生成・解釈するエンジンが必要になります。Envelopeにより、メッセージは表現されます。1.1で下位の通信プロトコルとしてHTTP、SMTP、FTPなどから選択できるようになったことからも分かるように、XML-RPCとは違って、下位の通信プロトコルはHTTPだけというわけではありません。2」や「XFire」があります。Thriftなどついて簡単に説明し、MapReduce/Hadoopとほかの技術の違いを述べます。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。