재밌는 내용을 봐서 정리해본다.
Monolithic아키텍처에서는 여러 서버간에 네트워크 통신이 필요하지 않다. 서버 하나에서 메서드들을 호출하기만 하면 된다.
하지만, MSA는 여러 장비에서 각각의 프로세스가 분리되다 보니 REST 통신을 통해서 각각의 프로세스가 요청-응답을 주고받는 구조가 된다. 이때 잠재적인 Latency가 존재할 수밖에 없게 된다.
HTTP는 기본적으로 TCP기반으로 동작한다. 3way-handshake로 연결을 시작하고, 4way-handshake로 연결을 종료한다.
매번 연결을 맺고 종료하면 비효율적일수밖에 없다.
구글에서 발표한 grpc는 이러한 문제를 해결하기 위해서 나왔다고 한다. grpcs는 확장가능하고 빠른 api를 만드는 데 사용하는 오픈소스 RPC 프레임워크고, HTTP/2기반으로 작동한다.
우선, http/2에서 생기는 문제들을 다시 봐보자.
JSON은 텍스트 기반의 데이터 포맷이므로 네트워크 효율성이 떨어진다. 직렬화/역직렬화 과정에서 CPU사용량이 많고 MSA간 빈번한 데이터 교환이 있다면 성능 저하가 발생한다.
JSON은 복잡한 데이터 구조, 날짜, 시간, 이진 데이터를 처리할 때 추가적인 파싱이나 인코딩도 필요하다.
grpc는 protobuf로(Protocol Buffers)로 json의 성능문제를 해결한다.
protobuf는 바이너리 형식으로 인코딩돼 더 작은 크기를 할당하고, 바이너리 형식은 파싱 속도가 더 빠르고 cpu사용량도 적다.
protobuf는 각 필드의 타입을 정확히 지정한다. Json에서는 age가 문자열이지만, protobuf는 정수형으로 정의돼 타입 불일치를 방지한다.
Json에서는 각 객체마다 필드 이름이 반복되지만, protobuf는 스키마에 한번만 정의된다.
참고자료 gRPC 를 도입하는 이유에 대해서 알아보자 (feat. HTTP 1.0 vs HTTP 1.1 vs HTTP 2.0)