1261.19 요청-응답 패턴의 구조와 특성
1. 요청-응답 패턴의 정의
요청-응답 패턴(request-response pattern)은 클라이언트(client)가 서버(server)에 요청 메시지(request message)를 전송하고, 서버가 이를 처리한 후 결과를 응답 메시지(response message)로 반환하는 양방향 일대일(one-to-one) 통신 패턴이다. 이 패턴은 원격 프로시저 호출(Remote Procedure Call, RPC)의 통신적 기반을 형성하며, 분산 컴퓨팅에서 가장 전통적이고 광범위하게 사용되는 상호작용 모형이다.
Birrell과 Nelson(1984)은 Implementing Remote Procedure Calls에서 RPC의 기본 구조를 정의하였으며, 이후 요청-응답 패턴은 CORBA, gRPC, ROS 서비스 등 다양한 분산 통신 프레임워크의 근간으로 채택되었다.
2. 구조적 구성 요소
2.1 클라이언트 (Client)
클라이언트는 서비스를 요청하는 측의 통신 종단점(endpoint)이다. 클라이언트는 요청 메시지를 구성하고 서버에 전송하며, 서버로부터의 응답을 수신하고 처리한다. 클라이언트는 서비스의 논리적 주소(예: 서비스 이름)를 통해 서버에 접근하며, 서버의 물리적 위치에 대한 직접적인 지식을 필요로 하지 않을 수 있다.
2.2 서버 (Server)
서버는 서비스를 제공하는 측의 통신 종단점이다. 서버는 특정 서비스 이름으로 자신을 등록하고, 해당 서비스에 대한 요청을 대기한다. 요청이 수신되면 서버는 요청에 명시된 연산을 수행하고, 그 결과를 응답 메시지로 구성하여 클라이언트에 반환한다.
2.3 요청 메시지와 응답 메시지
요청 메시지와 응답 메시지는 사전에 정의된 인터페이스 명세(interface specification)에 따라 구조화된다. ROS2에서는 .srv 파일을 통해 요청과 응답의 데이터 타입을 정의하며, 요청 필드와 응답 필드는 --- 구분자에 의해 분리된다.
3. 통신 흐름의 시간적 구조
요청-응답 패턴의 통신 흐름은 다음의 시간적 순서로 진행된다.
- 클라이언트가 요청 메시지를 직렬화하여 서버에 전송한다.
- 서버가 요청 메시지를 수신하고 역직렬화한다.
- 서버가 요청에 대한 처리를 수행한다.
- 서버가 응답 메시지를 직렬화하여 클라이언트에 반환한다.
- 클라이언트가 응답 메시지를 수신하고 역직렬화한다.
이 과정의 종단간 소요 시간은 다음과 같이 분해할 수 있다.
\tau_{\text{total}} = \tau_{\text{ser,req}} + \tau_{\text{net,req}} + \tau_{\text{deser,req}} + \tau_{\text{proc}} + \tau_{\text{ser,resp}} + \tau_{\text{net,resp}} + \tau_{\text{deser,resp}}
여기서 \tau_{\text{ser}}는 직렬화 시간, \tau_{\text{net}}는 네트워크 전송 시간, \tau_{\text{deser}}는 역직렬화 시간, \tau_{\text{proc}}는 서버측 처리 시간이다.
4. 요청-응답 패턴의 의미론적 보장
4.1 호출 의미론 (Invocation Semantics)
요청-응답 패턴에서 네트워크 장애 발생 시 요청의 실행 횟수에 대한 보장 수준을 호출 의미론(invocation semantics)이라 한다. 세 가지 수준의 의미론이 존재한다.
최소 한 번(At-Least-Once): 요청에 대한 응답을 수신할 때까지 재전송을 반복한다. 서버측에서 동일 요청이 복수 회 실행될 수 있다. 멱등(idempotent) 연산에 적합하다.
최대 한 번(At-Most-Once): 요청의 중복 실행을 방지한다. 네트워크 장애 시 요청이 실행되지 않을 수 있다. 비멱등(non-idempotent) 연산에 적합하다.
정확히 한 번(Exactly-Once): 요청이 정확히 한 번 실행됨을 보장한다. 분산 시스템에서의 완전한 구현이 어렵다.
4.2 ROS2 서비스의 호출 의미론
ROS2의 서비스 통신은 DDS의 신뢰성(Reliable) QoS 정책에 기반하여 동작하며, 요청과 응답의 전달을 보장한다. 그러나 서비스 호출 자체의 멱등성은 응용 수준에서 보장하여야 한다.
5. 요청-응답 패턴의 장점
논리적 명확성: 하나의 요청에 대하여 정확히 하나의 응답이 대응하는 단순한 인과 구조를 가지며, 통신 흐름의 추론이 용이하다.
결과의 즉시 활용: 응답 수신 후 결과를 즉시 후속 로직에 활용할 수 있어, 단계적 처리(sequential processing)에 자연스럽게 적합하다.
오류의 국소화: 서비스 호출의 성공 또는 실패가 호출 지점에서 즉시 판단 가능하여, 오류 처리 로직의 구현이 체계적이다.
타입 안전성: 요청과 응답의 데이터 타입이 인터페이스 정의에 의해 정적으로 결정되므로, 타입 불일치에 의한 오류를 컴파일 시점에 검출할 수 있다.
6. 요청-응답 패턴의 제약
시간적 결합: 클라이언트와 서버가 동시에 활성 상태에 있어야 통신이 가능하다. 서버의 비가용 시 클라이언트는 요청을 완료할 수 없다.
확장성의 제한: 서버가 단일 병목 지점(single bottleneck)이 될 수 있으며, 다수의 클라이언트로부터의 동시 요청 처리에 한계가 있다.
장시간 연산의 부적합성: 서버측 처리 시간이 길어지는 경우, 동기식 호출에서는 클라이언트의 장기간 차단이 발생하며, 비동기식 호출에서도 중간 진행 상황의 보고가 불가능하다.
단방향 데이터 흐름의 부재: 서버에서 클라이언트로의 자발적 데이터 전송(push)이 불가능하며, 클라이언트가 먼저 요청을 발행하여야만 데이터 교환이 개시된다.
7. 로봇 행동 제어에서의 적용
요청-응답 패턴은 로봇 행동 제어 시스템에서 다음의 목적으로 활용된다.
- 행동 모드의 전환 요청과 승인 확인
- 로봇 파라미터의 동적 조회 및 설정
- 좌표계 변환과 같은 단기 연산 서비스
- 시스템 상태의 즉시 질의
- 센서 교정(calibration) 명령의 실행
- 특정 조건의 성립 여부 확인
그러나 자율 주행 목표 도달, 물체 탐색 및 파지, 환경 매핑 등의 장시간 실행 행동에는 요청-응답 패턴만으로는 진행 상황 피드백과 취소 기능을 제공할 수 없으므로, 이러한 경우에는 보다 풍부한 상호작용을 지원하는 통신 패러다임이 필요하다.
요청-응답 패턴의 구조적 특성과 적용 한계에 대한 이해는 로봇 행동 제어에 적합한 통신 패러다임의 선택을 위한 기본 전제가 된다.