RPCはソケットを使った通信

図3●RPC(Remote Procedure Call)の仕組み
RPCを使うと,通常のライブラリ呼び出しと同じ感覚でほかのコンピュータで動く手続きを呼び出すことができる。このとき,「スタブ」と呼ばれる部分が,呼び出し内容や結果の通知をネットワークを利用する形に変換する。呼び出す内容や引数などが一連のデータとしてサーバーに送信される。サーバー側にあるスタブが,実際のプロセス呼び出しに変換する。結果は逆の過程をたどってクライアントに送られる。

 複数のプロセスが連携するためのさまざまな機構を「プロセス間通信」と呼ぶ。「通信」と呼ぶくらいであるから,ソケットを利用するものもある注2)。ソケットを使っていれば,1台のコンピュータの中でプロセスを連携させることにも利用できるし,まったく同じ機構を使って複数台のコンピュータで動作するプロセスを連携させることもできる。これがRPC(remote procedure call:遠隔手続き呼び出し)である。

 別のプロセスに処理を依頼するためには,(1)処理の種類(メソッド名),(2)処理すべきデータ(引数),(3)処理結果の受け取り(戻り値),を指定できなければならない。このためRPCを実現する仕組みは,「マーシャリング」と呼ぶデータのシリアル化などを実行する必要がある。一方で,プログラム自体があまりにRPCを意識したものにすると,可読性を損なう危険性がある。そこで通常は,クライアントとサーバー側にそれぞれ「スタブ」と呼ばれるRPCを実現するためのコードが追加される(図3[拡大表示])。ここがRPCを通じて呼び出す操作を,通常の手続き呼び出しに変換している。スタブのコードは,RPCで呼び出されるサーバー・プログラムを作成するときに,サーバーの仕様(呼び出し方法など)を定義したファイルを作成し,その定義ファイルをRPCジェネレータにかけることによって生成する注3)

インターネットで使うRPC=SOAP

 この動作モデルをインターネットでも使えるようにしよう,というのがSOAP(Simple Object Access Protocol)である。正確に言えば,SOAPのカバー範囲はもっと広いのだが,SOAP 1.1ではRPC型のモデルしか規定していない。RPC型とはすなわち,同期モデルに基づく呼び出しである。SOAPでリクエストを発行したら,サーバーの回答があるまで待たなければならない。SOAPには非同期型のメッセージ送信も使えることになっているが,現段階では規約として固まっていない。

 現在Webサービスと呼ばれるものは,実際の通信プロトコルにSOAPを使うほか,サービスの実装を記述するのにWSDL(Web Services Description Language),サービスの所在地を管理するのにUDDI(Universal Description,Discovery,and Integration)を使う(図4[拡大表示])。

 SOAPの特徴の一つは,データのやり取りをすべてXML(eXtensible Markup Language)で実行すること(図5[拡大表示])。トランスポートのプロトコルにHTTPなどのインターネット標準のプロトコルを使うことと相まって,インターネットを介した企業同士,あるいはクライアント-サーバーを接続できるプロトコルとして関心が高まっている。SOAPは当然,データベースのトランザクション処理のようなリアルタイム性の高い処理には向かない。インターネット経由ではHTTP自体遅延が少なくないし,XMLの解析は結構処理的に重たい。ある程度の大きさの処理依頼をするというのが基本だろう。その意味では,企業間をまたぐようなワークフローを実現するための規約であると考えるべきだ。

図4●Webサービスを構成する三つの規約
Webサービスの基本要素は,SOAP(Simple Object Access Protocol),WSDL(Web Services Description Language),UDDI(Universal Description,Discovery and Integration)の三つである。SOAPは実際にサービスに処理を依頼するときに利用するプロトコルである。WSDLはサービスが提供するメソッドや引数などを記述するための規約。そしてUDDIは,どこで誰がどのようなサービスを提供しているかを知るためにある。
 
図5●SOAPメッセージの構造
SOAPではやり取りするデータをXMLで記述する。SOAPが送るメッセージは「Envelope(封筒)」にくるまれて送られる。この中にHeaderとBodyがあり,HeaderにはSOAPメッセージの状態や回送経路などの情報が入り,Bodyにはサービスに処理を依頼するデータや処理後の結果データが入る。

「呼び出し方を指定する方法を定めておけば,データとして取り扱えるってことかぁ」
「そうだね。考えてみれば関数ポインタなんかも,データとしてメソッドを取り扱っているわけだ」
「でも,インターネットでWebサービスって,流行るんですかね」
「わかんないなぁ。うまく使えば確かに便利そうなんだけど。セキュリティとか課金の仕組みとか,いろいろやるべきことも残されてるからね。こういうものは一朝一夕にはいかないし,もうちょっと時間がかかるんじゃないかな」

(北郷 達郎、八木 玲子)