글 / gRPC 통신

gRPC 호출 방식 네 가지

요청과 응답 중 어디에 stream을 지정하는지에 따라 호출 방식이 네 가지로 구분된다.

작성일 · 읽는 시간 2분

구분 기준

gRPC의 호출 방식은 요청과 응답이 각각 단일 메시지인지, 여러 메시지를 순차적으로 전송하는 stream인지에 따라 구분된다. 조합이 네 가지이므로 호출 방식도 네 가지이다. 호출 방식은 메서드마다 개별적으로 지정하므로 한 서비스 내에서 여러 방식을 함께 사용할 수 있다.

요청과 응답의 stream 여부에 따른 호출 방식 네 가지

stream 선언 위치

.proto의 rpc 줄에서, 여러 메시지를 전송할 측의 메시지 타입 앞에 stream을 지정한다.

protobufdevice.proto
service DeviceService {
  // unary: 요청 하나, 응답 하나
  rpc GetStatus(StatusRequest) returns (Status);
  // 서버 스트리밍: 응답 쪽에 stream
  rpc WatchStatus(StatusRequest) returns (stream Status);
  // 클라이언트 스트리밍: 요청 쪽에 stream
  rpc UploadLogs(stream LogLine) returns (UploadSummary);
  // 양방향 스트리밍: 양쪽에 stream
  rpc Control(stream Command) returns (stream Progress);
}

호출 방식 네 가지의 메시지 방향 비교

방식별 용도

방식 요청 응답 용도
unary 하나 하나 값 조회, 단일 명령
서버 스트리밍 하나 여러 개 상태 변화 구독, 긴 목록 수신
클라이언트 스트리밍 여러 개 하나 로그나 측정값 업로드
양방향 스트리밍 여러 개 여러 개 명령과 진행 상황 교환

단일 메시지로 완료되는 작업에는 unary를 사용한다.

스트리밍의 공통 성질

  • 한 호출 내에서 메시지는 전송한 순서대로 도착한다.
  • 양방향 스트리밍의 두 stream은 서로 독립적이다. 서버는 메시지를 수신할 때마다 응답할 수도 있고, 모두 수신한 뒤에 응답할 수도 있다.
  • 클라이언트 스트리밍의 응답은 일반적으로 요청을 모두 수신한 뒤에 전송되지만, 이 순서가 강제되지는 않는다.

양방향 스트리밍에서 서버가 응답하는 시점 두 가지