제4장 통신 유형

내용 목차

4.1. 개요
4.2. 동기형 통신
4.3. 비동기형 통신
4.4. 대화형 통신
4.4.1. 대화형 통신 관련 이벤트

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

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

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


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


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


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


대화형 통신은 클라이언트와 서버 간에 이루어지는 반이중 통신이다. 처음 대화형 모드로 접속할 때 대화 주도권을 설정하며 대화 주도권을 잡는 측은 송신, 상대편은 수신만이 가능하다. 대화 주도권을 갖고 있는 쪽은 언제든지 상대편에게 주도권을 넘길 수 있으므로 메시지를 주고받는 것이 가능하다. 이러한 대화 주도권의 제어는 송신 측의 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()으로 할당되어야 한다.