Table Of Contents

Previous topic

様々な言語からMessagePack RPCで呼び出す

Next topic

分散実行による負荷分散

This Page

各種のネットワーク呼び出しプロトコルに対応させる

ここでは,ユーザプログラムをRaSC上で稼働させることにより,ネットワークを介した呼び出しを可能とする手順を説明します. 呼び出しプロトコルとして,MessagePack RPC, JSON RPC, ProtocolBuffers, SOAPが利用可能になり,用途に応じてプロトコルを使い分けることができます.

  • MessagePack RPC, ProtocolBuffers: 高効率なバイナリプロトコル.性能を重視する場合に利用
  • JSON RPC: 人間にも理解しやすいテキスト表現を使用.対応するプログラミング言語が多数あることに加え,コマンドラインツール等からも利用しやすい
  • SOAP: XMLベースのプロトコル.相互運用性の厳密なチェックが行われる.各種のサービス指向システムと連携しやすい

RaSC上で稼働させられるプログラムは, RaSCサービス化可能なプログラム で述べられたような条件を満たす必要があります. ここでは,そのような条件を満たす形態素解析エンジン MeCab を例に説明します.

RaSCサービスとしてユーザプログラムを起動する

まず RaSC の基本パッケージをダウンロードして解凍します. [1]

$ curl -o rasc-basic-1.0.1.zip "http://alaginrc.nict.go.jp/rasc/cgi-bin/dl.cgi?name=rasc-basic-1.0.1&type=zip"
$ unzip rasc-basic-1.0.1.zip

解凍すると,以下のファイルが展開されます.:

rasc-basic-1.0.1/
 + build.xml
 + jp.go.nict.wisdom.wrapper/
 + lib/
   + … (必須ライブラリ群)
 + script/
 + webapps/
   + WEB-INF
     + services/
       + SampleService.xml (サービス定義XMLの例)

このチュートリアルで作成するRaSCサービスは,Webアプリケーションをパッケージした war として作成し,それをJava ServletコンテナのJettyで動作させることになります.

WEB-INF/services 以下に置かれたサービス定義XMLのファイル名(拡張子を除いた部分)がサービス名になります.ここでは,MeCabをRaSCサービス化することを想定して,名称を変更します.

$ mv webapps/WEB-INF/services/SampleService.xml webapps/WEB-INF/services/MeCabService.xml

また,サービスの名前を設定するのに,以下の3つのファイルの編集が必要です.

  • webapps/WEB-INF/services/MeCabService.xml
  • build.xml
  • script/settings.json

まず,webapps/WEB-INF/serviceimpl/MeCabService.xml を開いて, 下記のように ___PATH_TO_PROGRAM___ となっている箇所に,実行したいユーザプログラムのコマンドラインを設定します. このファイルでは,RaSCが呼び出す実行プログラムに応じた設定を記述しています.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <bean id="target"
    class="jp.go.nict.langrid.servicecontainer.handler.TargetServiceFactory">
    <property name="service">
      <bean class="jp.go.nict.rasc.wrapper.StandardInputService">
        <property name="cmdLine" value="___PATH_TO_PROGRAM___" />
        <property name="delimiterIn" value="\n" />
        <property name="delimiterOut" value="EOS\n" />
      </bean>
    </property>
  </bean>
</beans>

次に,war を作成する build.xml を編集します.下記の ___WAR_NAME___ となっている箇所を変更し,war のファイル名を設定します. ここでは, jp.go.nict.rasc.mecabservice とすることにします.先に編集したXMLと同じ名前である必要はありません.

<target name="war" depends="wrapper">
  <property name="war_name" value="___WAR_NAME___"/>

  <war destfile="build/${war_name}.war" webxml="webapps/WEB-INF/web.xml">
    <webinf dir="webapps/WEB-INF" includes="**/*.*" excludes="**/web.xml" />
    <lib dir="lib" includes="**/*.jar" />
    <lib dir="build" includes="wrapper.jar" />
  </war>
</target>

最後に, サーバの設定を記述した settings.json を編集します.___WAR_NAME___ には,先に設定したものを使います. また, ___SERVICE_NAME___ には,先に設定したXMLファイルの名前 (MeCabService) を設定します.

{
     "serverName" : "RaSCServer",
     "jettyPort" : 8080,
     "controlPort" : 0,
     "httpServices" : [
                    { "contextPath":"/___WAR_NAME___",
                      "serviceName":"___SERVICE_NAME___",
                      "warPath":"../build/___WAR_NAME___.war" }
                ]
     "msgpackServices" : [
                    { "contextPath":"/___WAR_NAME___",
                      "serviceName":"___SERVICE_NAME___",
                      "warPath":"../build/___WAR_NAME___.war",
                      "msgpackPort":9090 }
                  ]
}

同梱されたデフォルトの設定では,MessagePack RPCにポート9090,JSON RPC, ProtocolBuffers, SOAPなどHTTP上のプロトコルにポート8080を割り当てます.

パッケージを展開したパスで,下記のコマンドを実行すると,warが作成され,RaSCサービスが起動します. このサービスは,MessagePack RPC,JSON RPC, ProtocolBuffers, SOAPのいずれのプロトコルでも呼び出せます.

$ ant
$ cd script
$ sh ./basic_server.sh start

なお,停止は下記のコマンドで行います.

$ sh ./basic_server.sh stop

以下では,JSON RPCによる呼び出し方法を紹介します.JSON RPCを用いることのメリットは,簡便さと理解しやすさです. 例えば下記のように,curlコマンドを用いて,JSON RPCでサービスを実行することができます. GETパラメータに,メソッド名とパラメータを渡しています.

$ curl "http://localhost:8080/jp.go.nict.rasc.mecabservice/jsonServices/MeCabService?method=analyze&params=\[\"今日の天気はどうですか\"\]"

JSON RPCについては,簡易的にブラウザ上からテストするためのインターフェースを用意しています. 下記のURLをブラウザで開くと,インタフェースが表示され,サービス呼び出しを行えます.___WAR_NAME___ は先に設定したものに置き換えてください.:

http://localhost:8080/___WAR_NAME___/jsonServices/

以下にスクリーンショットを示します.String analyze(String) というメソッドについて, “+”をクリックすると,入力欄が開きます. ユーザプログラムに与えたい内容を入力して,”invoke” を押すとJSON RPCでの呼び出しが行われ,結果が表示されます.

_images/json_gui.png

図1: JSON RPC呼び出しGUI

その他のプロトコルでの呼び出しについては,以下で説明しています.

[1]このパッケージは,GitHubに登録されたプロジェクトpkg_basicから生成されたものです.