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の解析は結構処理的に重たい。ある程度の大きさの処理依頼をするというのが基本だろう。その意味では,企業間をまたぐようなワークフローを実現するための規約であると考えるべきだ。
「呼び出し方を指定する方法を定めておけば,データとして取り扱えるってことかぁ」
「そうだね。考えてみれば関数ポインタなんかも,データとしてメソッドを取り扱っているわけだ」
「でも,インターネットでWebサービスって,流行るんですかね」
「わかんないなぁ。うまく使えば確かに便利そうなんだけど。セキュリティとか課金の仕組みとか,いろいろやるべきことも残されてるからね。こういうものは一朝一夕にはいかないし,もうちょっと時間がかかるんじゃないかな」