신뢰성 메시징 기술
본 장에서는 신뢰성 메시징 기술에 대한 개념과 설정 방법에 대해서 설명한다.
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 파일의 예이다.
<?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의 내용이다.
<?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 파일의 예이다.
<?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