gRPC 호출 방식 네 가지
요청과 응답 중 어디에 stream을 지정하는지에 따라 호출 방식이 네 가지로 구분된다.
구분 기준
gRPC의 호출 방식은 요청과 응답이 각각 단일 메시지인지, 여러 메시지를 순차적으로 전송하는 stream인지에 따라 구분된다. 조합이 네 가지이므로 호출 방식도 네 가지이다. 호출 방식은 메서드마다 개별적으로 지정하므로 한 서비스 내에서 여러 방식을 함께 사용할 수 있다.
stream 선언 위치
.proto의 rpc 줄에서, 여러 메시지를 전송할 측의 메시지 타입 앞에 stream을 지정한다.
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은 서로 독립적이다. 서버는 메시지를 수신할 때마다 응답할 수도 있고, 모두 수신한 뒤에 응답할 수도 있다.
- 클라이언트 스트리밍의 응답은 일반적으로 요청을 모두 수신한 뒤에 전송되지만, 이 순서가 강제되지는 않는다.