What is gRPC ?
역시 gRPC 공식 홈페이지의 guide flow를 따라가기로 한다.
What is gRPC ? 와 gRPC concepts 를 참조한다.
거의 해석에 가까운 포스팅이 될지도 모르겠으나, 영어 공부도 할겸…
gRPC와 지난 포스팅에서 맛 본 protocol buffers에 대해 알아보자.
gRPC는 protocol buffer를 gRPC의 Interface Definition Language(IDL)임과 동시에 메세지 교환 형식으로 이용한다.
(이게 뭐지 싶으면 앞 선 포스팅를 훑어보고 오면 된다.)
Overview
이 한 줄이 gRPC를 아주 간단 명료하게 잘 설명하고있다.
In gRPC, a client application can directly call a method on a server application on a different machine as if it were a local object, making it easier for you to create distributed applications and services
gRPC를 이용해서 클라이언트는 서버의 메소드를 마치 자신의 로컬 메소드인 것 마냥 호출할 수 있게 하고,이로부터 분산 시스템과 서비스 구축을 수월하게 할 수 있다.
서버쪽에서는 제공할 메소드의 인터페이스를 구현하여 서버를 돌려 클라이언트 호출을 핸들링한다. 클라리언트쪽에서는 stub
이라는 것을 가지고 있어서, 위에서 말한 것 처럼 서버의 메소드를 이를 통해 제공받는다. (어떤 언어는 이 client단 stub을 그냥 클라이언트라고 하기도 함)
사실 Flask 를 쓰면서 event driven handling에 깊게 매료되어 있었는데, 양방향 통신이 되고 나면 서버쪽과 클라이언트코드를 같이 보게 되고, 귀찮아지고, 대충 짜고… 멀티쓰레드나 멀티프로세스를 추가하면 나름 성가신 부분들이 있었다. gRPC가 그 동안의 노고들에 얼마나 엿을 먹여줄지는 모르겠지만, 그런게 많을 수록 그 만큼 작업들이 더 간결해진다는 말일테니 기대해본다.
어찌됐건 위 그림 처럼 다양한 언어가 gRPC를 통해 통신하고 있다.이게 또 장점이라면 장점 아닐까 싶다.
Working with Protocol Buffers
기본적으로 gRPC는 Protocol Buffer라는 것을 사용한다.
공부해가면서 차츰 깊게 파보기로하고, 간략히 설명하자면, 데이터 구조를 Serializing하기 위한 메커니즘
으로 정의 내리고있다. .proto
파일에 serialize되는 데이터의 구조를 정의한다. 그러면 Protocol buffer data가 이를 기반으로 key-value pair 형태를 가지는 작은 단위의 메세지로 serialized된다.
흔히 생각해 볼 수 있는 자동차 데이터 구조를 생각해보자. 이를 .proto
에 나타내면
message Car {
required string car_name = 1;
required int32 car_number = 2;
message Engine {
bool start = 1;
float temperature = 2;
}
}
대충 이런 형식을 생각해 볼 수 있다. 여기서 숫자 1, 2, 3은 필드에 대한 id정도로 생각하면 된다. 변수에 저 값들이 할당되었다는 게 아니다.
이전 포스팅에서 코드를 generate 했던 것 처럼 protocol buffer compiler인 protoc
를 통해 자신의 언어에 맞게 DAC(Data Access Classes) 를 .proto
의 정의에 맞게 생성한다. 각 필드에 대해, 간단한 접근자들 (like name()
or set_name()
) , raw byte로 혹은 이로 부터 데이터 구조를 serialize하거나 parse하는 메소드를 제공한다. 이러한 클래스들을 자신의 application에서 사용할 수 있게 된다.
.proto
에 임의의 데이터 구조에 대해 제공할 서비스까지 정의하는 예시를 보자. 즉흥적으로 이름만 바꿔가며 작성한 것이지만 틀린 부분이 있다면 어떠한 태클도 환영이다.
service StatusChecker {
rpc IsStarted (EngineStatusRequest) returns (EngineStatusReply) {}
}
message EngineStatusRequest {
int32 car_number = 1; // Request a status of the given car
}
message EngineStatusReply {
string summary = 1; // Replay a message summerized into a string
}
(뭐 대강 이런식이고, 좀 더 고급지게 사용할 수도 있을 듯 한데..)
하다보니 문득 다들 한 번씩 해보는 채팅프로그램을 만들어 보면 좋겠다는 생각이 든다. 어차피 가이드는 공식사이트에 널리고 널렸겠으니.. 급 본 포스팅을 접고 다음 포스팅에서 막무가내로 한번 진행해보려한다. 사실 위 내용이 Overview로는 전부다.