통신 유형

본 장에서는 Tmax에서 지원하는 통신 유형에 대해 설명한다.

1. 개요

Tmax 시스템에서 응용 서버와 클라이언트 사이의 통신은 동기형 통신, 비동기형 통신, 대화형 통신의 3가지 유형으로 구분된다.

  • 동기/비동기형 통신

    • 일반적인 경우 동기형 통신을 가장 많이 사용한다. 클라이언트는 한 번에 하나의 요청을 보내고 응답을 받는다. 서버는 요청을 처리할 때 1건씩 처리를 종료한 후 다른 요청을 받는다.

    • tpcall()과 tpacall()로 서비스 요청을 한다. 데이터를 보내기 전에 반드시 tpalloc()으로 송수신 버퍼를 할당해야 한다. 서버의 업무 처리 서비스 루틴은 tpreturn() 또는 tpforward()에 의해서 종료된다.

    • 동기형 통신은 클라이언트가 tpcall()을 호출하여 서버에 요청을 보내고 서버에서 응답이 올 때까지 블로킹(blocking)되어 기다린다.

      비동기형 통신은 클라이언트가 tpacall()을 호출하여 서버에 요청을 보낸 후 서버에서 응답이 올 때까지 기다리지 않고, 다른 일을 처리할 수 있다. 응답을 받을 경우 tpgetrply()를 호출하여 서버로부터 응답을 받는다.

  • 대화형 통신

    • 서버는 동기/비동기형 통신과는 달리 반드시 대화형 서비스 함수만을 사용하여 프로그램을 개발해야 한다. 대화형 모드에서 보통 연결 유지 시간이 길어 잘 사용하지 않는다.

    • tpconnect()로 서비스 요청을 초기화한다. 데이터를 주고받기 위해 tpsend()와 tprecv()를 이용한다. 데이터를 보내기 전에 반드시 tpalloc()으로 송,수신 버퍼를 할당해야 한다.

    • 대화형 통신에서 tpforward()는 사용할 수 없다.

2. 동기형 통신

동기형 통신은 클라이언트가 서비스를 요청하고, 그 응답이 오거나 타임아웃이 될 때까지 기다린다. 서비스를 요청한 후 클라이언트는 블로킹(blocking) 상태로 응답을 기다린다.

figure 5 1
동기형 통신

다음 그림은 동기형 통신을 사용하는 클라이언트/서버 프로그램의 동작 원리이다.

figure 4 1
동기형 통신 모델

동기형 통신과 관련된 함수에 대한 자세한 설명은 동기형 통신이나 Tmax Reference Guide를 참고한다.

3. 비동기형 통신

비동기형 통신은 클라이언트가 서비스를 요청하고 응답을 기다리지 않고 다른 일을 계속할 수 있다. 응답을 받을 때 해당 요청에 대한 응답을 받는다. 서비스를 요청하는 tpacall()은 호출할 때 즉시 반환되어 다른 서비스 요청을 처리할 수 있다. 하지만 응답을 받기 위해 호출하는 tpgetrply()는 응답이 도착하거나 타임아웃이 될 때까지 blocking 상태로 기다린다.

figure 5 2
비동기형 통신

다음 그림은 비동기형 통신을 사용하는 클라이언트/서버 프로그램의 동작원리이다.

figure 4 2
비동기형 통신 모델

비동기 통신과 관련된 함수에 대한 자세한 설명은 비동기형 통신이나 Tmax Reference Guide를 참고한다.

4. 대화형 통신

대화형 통신은 클라이언트와 서버 간에 이루어지는 반이중 통신이다. 처음 대화형 모드로 접속할 때 대화 주도권을 설정하며 대화 주도권을 잡는 측은 송신, 상대편은 수신만이 가능하다. 대화 주도권을 갖고 있는 쪽은 언제든지 상대편에게 주도권을 넘길 수 있으므로 메시지를 주고받는 것이 가능하다. 대화 주도권의 제어는 송신 측의 flags를 사용하여 이루어지며 수신 측은 이러한 변화를 이벤트 값을 통해 알 수 있다.

다음은 간단한 대화형 통신의 연결 컨트롤을 넘기는 것과 연결을 종료하는 과정에 대한 설명이다.

figure 7 1
대화형 통신

대화형 통신은 tpconnect()로 연결한 후 tpsend()와 tprecv()를 호출하여 데이터를 주고받는다. 데이터를 보내려면 tpconnect()와 tpsend()에서 flags 값의 설정으로만 움직이는 연결 컨트롤을 가져야만 가능하다.

다음 그림은 대화형 통신을 사용하는 클라이언트/서버 프로그램의 동작원리이다.

figure 4 3
대화형 통신 모델
  • 대화형 통신은 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를 참고한다.