신뢰성 메시징 기술

본 장에서는 신뢰성 메시징 기술에 대한 개념과 설정 방법에 대해서 설명한다.

1. 개요

신뢰성 메시징은 더욱더 신뢰성 있는 웹 서비스를 위한 양질의 서비스(Quality of Service, QOS)를 위함이다. 신뢰성은 하나의 지점으로부터 다른 하나의 지점으로 메시지를 전달할 수 있는 능력에 의해 측정될 수 있다. 이러한 신뢰성 메시징은 웹 서비스의 양 끝단에서 애플리케이션 메시지들의 전달을 보장하는 것이 주요 목적이다.

신뢰성 메시징 기술(WS-Reliable Messaging)은 메시지가 전달되지 못한 경우에 이를 복구하는 기술로 어떤 메시지들이 오직 한 번만 부과적으로는 순서에 맞게 웹 서비스의 양 끝단에 전달되는 것을 보장한다. 메시지가 중간에서 사라졌다면 메시지를 보낸 시스템은 이를 받아들이는 시스템으로부터 확인(Acknowledge) 메시지를 받을 때까지 그 메시지를 재전송하고, 받아들이는 시스템에서 메시지들이 순서에 맞게 들어오지 않았다면 이를 순서에 맞게 다시 수정해서 웹 서비스 Endpoint에 전달하게 된다.

이러한 신뢰성 메시징에 관한 스펙으로는 다음과 같은 것들이 있다.

  • WS-Reliable Messaging

  • WS-Coordination

  • WS-AtomicTransactions

다음과 같은 문제점들이 발생할 경우에는 신뢰성 메시징 기술의 사용을 고려해야 한다.

  • 통신 실패(Communication failure)가 발생하여 네트워크(Unavailable network)가 연결되지 않거나 연결의 끊김(Connection drop)이 현상이 발생하는 경우

  • 애플리케이션 메시지가 전송 도중 사라지는 경우

  • 순서에 맞게 전송되는 애플리케이션 메시지를 요구하는 경우인데 순서에 맞게 전송되지 않는 경우

신뢰성 메시징 기술을 사용할 것인지를 고려할 때 다음과 같은 장단점들 비교해봐야 한다.

  • 신뢰성 메시징은 소스로부터 목적지까지 단 한 번만 전송되는 것을 의미한다. 만약 순서에 맞게 전송되는 옵션을 선택한 경우 그 메시지는 순서에 맞게 전송된다.

  • 신뢰성 메시징으로 웹 서비스의 메시지를 전송하는 경우 이는 전체 웹 서비스의 성능을 저하시킬 수 있다. 특히 순서에 맞게 전송되는 옵션일 경우에 더 심하다.

  • 신뢰성 메시징을 사용하지 않는 클라이언트는 이를 사용하는 웹 서비스와 상호 운용할 수 없다.

2. 서버 설정

서버의 WS-Reliable Messaging 설정은 WSDL로부터 구현할 수도 있고, Java 클래스로부터 설정할 수도 있다.

2.1. WSDL로부터 설정

WS-Reliable Messaging을 WSDL로부터 구현하기 위해서는 웹 서비스 Addressing의 경우와 마찬가지로 WSDL 문서에 웹 서비스 정책을 설정하고 wsimport 툴을 사용하여 웹 서비스를 생성한다.

WSDL 파일에 WS-Reliable Messaging을 웹 서비스 정책을 설정하는 방법은 다음과 같다.

  • 기본적으로 PolicyAssertion에 다음을 설정한다.

    <wsrm:RMAssertion xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy" />
  • 순서에 맞는 전송(inorder)을 보장받기 위해서는 PolicyAssertion에 다음을 설정한다.

    <rmp:Ordered xmlns:rmp="http://sun.com/2006/03/rm" />

다음은 이와 같이 구성한 WSDL 파일의 예이다.

서버의 WS-Reliable Messaging 설정 : <AddNumbers.wsdl>
<?xml version="1.0" ?>
<definitions name="AddNumbers" targetNamespace="http://example.org"
    xmlns:tns="http://example.org" xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"
    xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
    <wsp:UsingPolicy />
    <wsp:Policy wsu:Id="AddNumbers_policy">
        <wsp:ExactlyOne>
            <wsp:All>
                <wsaw:UsingAddressing />
                <wsrm:RMAssertion>
                    <wsrm:InactivityTimeout Milliseconds="600" />
                    <wsrm:AcknowledgementInterval Milliseconds="200" />
                </wsrm:RMAssertion>
            </wsp:All>
        </wsp:ExactlyOne>
    </wsp:Policy>
    <types>
        <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified"
            targetNamespace="http://example.org">
            <element name="addNumbersResponse" type="tns:addNumbersResponse" />
            <complexType name="addNumbersResponse">
                <sequence>
                    <element name="return" type="xsd:int" />
                </sequence>
            </complexType>
            <element name="addNumbers" type="tns:addNumbers" />
            <complexType name="addNumbers">
                <sequence>
                    <element name="arg0" type="xsd:int" />
                    <element name="arg1" type="xsd:int" />
                </sequence>
            </complexType>
        </xsd:schema>
    </types>
    <message name="addNumbers">
        <part name="parameters" element="tns:addNumbers" />
    </message>
    <message name="addNumbersResponse">
        <part name="result" element="tns:addNumbersResponse" />
    </message>
    <portType name="AddNumbersPortType">
        <operation name="addNumbers">
            <input message="tns:addNumbers" name="add" />
            <output message="tns:addNumbersResponse" name="addResponse" />
        </operation>
    </portType>
    <binding name="AddNumbersBinding" type="tns:AddNumbersPortType">
        <wsp:PolicyReference URI="#AddNumbers_policy" />
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
            style="document" />
        <operation name="addNumbers">
            <soap:operation soapAction="" />
            <input>
                <soap:body use="literal" />
            </input>
            <output>
                <soap:body use="literal" />
            </output>
        </operation>
    </binding>
    <service name="AddNumbersService">
        <port name="AddNumbersPort" binding="tns:AddNumbersBinding">
            <soap:address location="REPLACE_WITH_ACTUAL_URL" />
        </port>
    </service>
</definitions>

2.2. Java 클래스로부터 설정

Java 클래스로부터 WS-Reliable Mesaaging을 설정하기 위해서는 다음과 같이 wsgen 툴의 -policy 기능을 이용하여 wsit-endpoint.xml을 먼저 얻어야 한다.

$ wsgen fromjava.server.AddNumbersImpl -d web/WEB-INF -policy service-config.xml

다음은 service-config.xml의 내용이다.

Java 클래스의 WS-Reliable Messaging 설정 : <service-config.xml>
<?xml version="1.0" encoding="UTF-8"?>
<web-services-config xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <policy>
        <endpoint-policy-subject>
            <addressing-policy/>
            <rm-policy>
                <inactivityTimeout>600000</inactivityTimeout>
                <acknowledgementInterval>1000</acknowledgementInterval>
            </rm-policy>
        </endpoint-policy-subject>
    </policy>
</web-services-config>

3. 클라이언트 설정

WS-Reliable Messaging을 위한 클라이언트의 추가적인 설정은 필요하지 않다. JEUS 웹 서비스는 클라이언트의 런타임에 원격 웹 서비스 WSDL의 WS-Reliable Messaging 정책을 해석해서 자동으로 WS-Reliable Messaging을 위한 환경을 제공한다.

4. 예제

Java 클래스로부터의 구현은 wsit-endpoint.xml이라는 DD 파일이 WAR 또는 EAR 패키징에서 WEB-INF 폴더에 추가된다는 사실을 제외하고 기본적인 JEUS 9 웹 서비스와 동일하다.

다음은 service-config.xml 파일의 예이다.

WS-Reliable Messaging 설정 : <service-config.xml>
<?xml version="1.0" encoding="UTF-8"?>
<web-services-config xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <policy>
        <endpoint-policy-subject>
            <addressing-policy/>
            <rm-policy>
                <inactivityTimeout>600000</inactivityTimeout>
                <acknowledgementInterval>1000</acknowledgementInterval>
            </rm-policy>
        </endpoint-policy-subject>
    </policy>
</web-services-config>

5. 예제 실행

위의 service-config.xml 파일을 가지고 wsgen을 통해 웹 서비스를 생성하기 위해서는 다음과 같이 입력한다.

$ ant build

웹 서비스가 정상적으로 생성되었다면 다음과 같은 구조를 갖게 된다.

web
 |
 +-- WEB-INF
        |
        +-- wsit-fromjava.server.AddNumbersImpl.xml
        +-- classes
               |
               +-- fromjava.server.AddNumbersImpl

wsit-fromjava.server.AddNumbersImpl.xml 파일은 WAR 또는 EAR 패키징에서 WEB-INF 폴더에 추가된 것이다.

서비스를 deploy하기 위해 다음과 같이 실행한다.

$ ant deploy

웹 서비스가 정상적으로 deploy되면 이를 사용하는 클라이언트를 다음과 같이 생성하고 서비스를 호출한다.

$ ant run

...

run:
     [java] ##########################################
     [java] ### JAX-WS Webservices examples - wsit ###
     [java] ##########################################
     [java] Testing wsit webservices...
     [java] Success!

...

BUILD SUCCESSFUL