통신 유형
본 장에서는 Tmax에서 지원하는 통신 유형에 대해 설명한다.
1. 개요
Tmax 시스템에서 응용 서버와 클라이언트 사이의 통신은 동기형 통신, 비동기형 통신, 대화형 통신의 3가지 유형으로 구분된다.
-
동기/비동기형 통신
-
일반적인 경우 동기형 통신을 가장 많이 사용한다. 클라이언트는 한 번에 하나의 요청을 보내고 응답을 받는다. 서버는 요청을 처리할 때 1건씩 처리를 종료한 후 다른 요청을 받는다.
-
tpcall()과 tpacall()로 서비스 요청을 한다. 데이터를 보내기 전에 반드시 tpalloc()으로 송수신 버퍼를 할당해야 한다. 서버의 업무 처리 서비스 루틴은 tpreturn() 또는 tpforward()에 의해서 종료된다.
-
동기형 통신은 클라이언트가 tpcall()을 호출하여 서버에 요청을 보내고 서버에서 응답이 올 때까지 블로킹(blocking)되어 기다린다.
비동기형 통신은 클라이언트가 tpacall()을 호출하여 서버에 요청을 보낸 후 서버에서 응답이 올 때까지 기다리지 않고, 다른 일을 처리할 수 있다. 응답을 받을 경우 tpgetrply()를 호출하여 서버로부터 응답을 받는다.
-
-
대화형 통신
-
서버는 동기/비동기형 통신과는 달리 반드시 대화형 서비스 함수만을 사용하여 프로그램을 개발해야 한다. 대화형 모드에서 보통 연결 유지 시간이 길어 잘 사용하지 않는다.
-
tpconnect()로 서비스 요청을 초기화한다. 데이터를 주고받기 위해 tpsend()와 tprecv()를 이용한다. 데이터를 보내기 전에 반드시 tpalloc()으로 송,수신 버퍼를 할당해야 한다.
-
대화형 통신에서 tpforward()는 사용할 수 없다.
-
2. 동기형 통신
동기형 통신은 클라이언트가 서비스를 요청하고, 그 응답이 오거나 타임아웃이 될 때까지 기다린다. 서비스를 요청한 후 클라이언트는 블로킹(blocking) 상태로 응답을 기다린다.
다음 그림은 동기형 통신을 사용하는 클라이언트/서버 프로그램의 동작 원리이다.
동기형 통신과 관련된 함수에 대한 자세한 설명은 동기형 통신이나 Tmax Reference Guide를 참고한다. |
3. 비동기형 통신
비동기형 통신은 클라이언트가 서비스를 요청하고 응답을 기다리지 않고 다른 일을 계속할 수 있다. 응답을 받을 때 해당 요청에 대한 응답을 받는다. 서비스를 요청하는 tpacall()은 호출할 때 즉시 반환되어 다른 서비스 요청을 처리할 수 있다. 하지만 응답을 받기 위해 호출하는 tpgetrply()는 응답이 도착하거나 타임아웃이 될 때까지 blocking 상태로 기다린다.
다음 그림은 비동기형 통신을 사용하는 클라이언트/서버 프로그램의 동작원리이다.
비동기 통신과 관련된 함수에 대한 자세한 설명은 비동기형 통신이나 Tmax Reference Guide를 참고한다. |
4. 대화형 통신
대화형 통신은 클라이언트와 서버 간에 이루어지는 반이중 통신이다. 처음 대화형 모드로 접속할 때 대화 주도권을 설정하며 대화 주도권을 잡는 측은 송신, 상대편은 수신만이 가능하다. 대화 주도권을 갖고 있는 쪽은 언제든지 상대편에게 주도권을 넘길 수 있으므로 메시지를 주고받는 것이 가능하다. 대화 주도권의 제어는 송신 측의 flags를 사용하여 이루어지며 수신 측은 이러한 변화를 이벤트 값을 통해 알 수 있다.
다음은 간단한 대화형 통신의 연결 컨트롤을 넘기는 것과 연결을 종료하는 과정에 대한 설명이다.
대화형 통신은 tpconnect()로 연결한 후 tpsend()와 tprecv()를 호출하여 데이터를 주고받는다. 데이터를 보내려면 tpconnect()와 tpsend()에서 flags 값의 설정으로만 움직이는 연결 컨트롤을 가져야만 가능하다.
다음 그림은 대화형 통신을 사용하는 클라이언트/서버 프로그램의 동작원리이다.
-
대화형 통신은 tpconnect()를 호출함으로써 시작된다. 함수는 해당 대화형 서비스에 데이터를 보내는 동시에 대화 주도권을 설정하게 된다. tpconnect()가 성공적으로 수행되면 각각의 대화모드를 구분하기 위한 '연결 구분자(cd)'를 반환하며 이것을 이용하여 메시지를 송수신할 수 있게 된다.
-
대화형 통신은 서비스 중 문맥(context)에 따라 추가적인 정보가 필요한 경우에 사용한다. 그러나 연결 설정(tpconnect())에서 연결 해제(tpdiscon() 또는 tpreturn())까지 다른 통신과 비교하여 상대적으로 장시간 연결이 유지되어야 한다. 장시간 연결 유지는 네트워크의 부하를 증가시키므로 가능하면 동기/비동기 통신을 이용할 것을 권장한다.
-
일반적으로 대화형 통신은 서버 측에서 tpreturn()을 호출하여 완료된다. 이러한 경우 상대방은 데이터와 함께 TPEV_SVCSUCC 이벤트를 수신하게 된다. 대화를 시도한 측에서 tpdiscon()를 호출하여 대화형 통신을 강제적으로 종료할 수도 있는데 이 경우 전송 중의 데이터는 사라질 수도 있고 진행 중인 트랜잭션은 rollback된다.
-
대화 주도권은 주도권을 갖고 있는 측에서만 상대방에게 넘겨줄 수 있으며 tpsend()의 TPRECVONLY flags를 이용한다. 상대방은 데이터와 함께 TPEV_SENDONLY 이벤트를 수신하게 되고 대화 주도권을 잡게 된다.
-
컨트롤을 상대방에 넘길 때는 tpconnect() 또는 tpsend()에서 flags 파라미터를 TPRECVONLY로 설정하여 호출한다. 그러면 상대방에서 TPEV_SENDONLY라는 이벤트가 발생하여 컨트롤이 넘어왔음을 알게 된다. 이후부터 tpsend()를 호출해서 데이터를 보낼 수 있다. 물론 상대방은 데이터 수신만 가능하다.
-
대화형 모드에서 사용하는 버퍼도 동기/비동기 통신처럼 버퍼를 써야 하며, 미리 tpalloc()으로 할당하여야 한다. Tmax 통신에서 사용하는 모든 버퍼는 tpalloc()으로 할당되어야 한다.
대화형 통신과 관련된 함수에 대한 자세한 설명은 대화형 통신이나 Tmax Reference Guide를 참고한다. |
4.1. 대화형 통신 관련 이벤트
대화형 통신에서는 다음과 같이 5가지의 이벤트가 존재한다.
이벤트 | 받는 함수 | 설명 |
---|---|---|
TPEV_SENDONLY (0x0020) |
tprecv() |
연결 컨트롤이 존재하는 장소를 알려준다. |
TPEV_DISCONIMM (0x0001) |
tesend() tprecv() tpreturn() |
연결이 비규칙적으로 끊어졌을 때 받는 이벤트로 tpdiscon()이 호출되거나 하위 서비스들이 여전히 열린 채 남아 있는데 tpreturn()를 호출할 때 발생한다. |
TPEV_SVCERR (0x0002) |
tpsend() tprecv() |
연결 컨트롤을 가지지 않았는데 tpreturn()를 호출할 때 발생하는 이벤트로 tpreturn()의 파라미터는 정당하지만 어떤 에러가 생겼을 때 발생한다. |
TPEV_SVCFAIL (0x0004) |
tpsend() tprecv() |
연결 컨트롤을 가지지 않은 상태에서 tpreturn()를 호출하거나 tpreturn()에서 TPFAIL, TPEXIT로 설정하여 호출할 때 발생한다. |
TPEV_SVCSUCC (0x0008) |
tprecv() |
성공적으로 서비스를 마치는 경우에 발생하는 이벤트로 TPSUCCES로 설정되어 tpreturn()이 호출된다. |
함수에 대한 자세한 설명은 Tmax Reference Guide를 참고한다. |