개요
현재 WebRTC 프로젝트에서 사용자의 시스템 접속 상태관리를 위해 상태관리 서버를 사용하고 있다. 또한, 현재 마이크로서비스 간 통신을 위해 TCP connection pool을 통해 연결해놓고 있다. 여기서 개선방향을 찾고자 다른 방법에 관하여 공부해보고자 한다.
먼저 gRPC에 앞서 RPC에 대해 이해해야 한다.
기초 지식
RPC란?
RPC는 Remote Procedure Call이다. 이는 한국어로 해석하면 원격 프로시져 호출, 즉, 범위 외부에 있는 대상을 호출하는 것이다.
따라서, 마이크로서비스에 적용하기에 국한 시켜 이해하자면, 네트워크로 연결된 마이크로서비스의 함수를 호출할 수 있는 통신 기술이다.
장점으로 개발자는 인터페이스를 통해 원격 함수를 호출하므로, 다른 마이크로서비스의 내부 동작과 네트워크 통신을 직접 다룰 필요가 없어진다.
여기서 인터페이스는 보통 IDL(Interface Definition Language)를 사용하여 정의된다. 이는 프로그래밍 언어와 플랫폼에 독립적으로 인터페이스를 기술하는 언어로, RPC 시스템에 의해 사용되는 데이터 형식과 함수를 명세화 하여 구성된다.
구성 정보에는 함수명, 함수의 매개변수, 반환 값, 예외 처리 등의 정보가 포함되며, 주로 사용되는 RPC 시스템에는 JSON-RPC, XML-RPC 등이 있다.
그렇다면, 처음에 언급한 gRPC통신은 무엇일까?
gRPC란?
gRPC는 구글이 최초로 개발한 오픈소스 RPC 시스템이다. 이는 전송을 위해 HTTP/2를, 인터페이스 정의 언어, 즉, IDL로 프로토콜 버퍼를 사용하여 인증, 양방향 스트리밍 및 흐름 제어 등의 기능을 제공한다. (출처 위키피디아-gRPC)
처음 개요에서 언급했다시피, 마이크로서비스 아키텍처에서 자주 사용되기도 한다.
인터페이스 정의 언어로 프로토콜 버퍼(protobuf)를 사용한다고 하였다. 이는 구조화된 데이터를 직렬화하기 위한 언어 중 하나로, gRPC에서 데이터 형식과 서비스를 정의하는데 사용된다. gRPC의 인터페이스는 .proto파일에 기술되며, 메서드, 메서드 입/출력 등이 포함된다.
gRPC이 활용 시, 정해진 구조에 따라 데이터를 직렬화 하므로, 바이너리 형식을 통해 네트워크 통신이 이루어져, 효율적인 통신을 가능케 한다.
gRPC의 장단점
출처 - Microsoft
장점
- 성능 : HTTP/2 프로토콜을 기반으로 하여 다중화와 스트리밍 기능을 제공한다. 이로 인해 네트워크 통신 성능이 향상되고 빠른 응답 시간과 데이터 전송이 가능하다.
- 직렬화 : gRPC는 Protocol Buffer를 사용하여 구조화된 데이터를 직렬화 한다. 이는 가벼운 바이너리 데이터 형식을 제공함으로써, 더 적은 Bandwidth와 CPU resouce를 사용하여 데이터를 전송할 수 있다.
- 다양한 언어 : gRPC는 c++, Java, Python, Go, C#, JavaScript 등 다양한 프로그래밍 언어를 지원하여 클라이언트-서버 간 언어 제약 없이 통신 가능하다.
- 스트리밍 지원 : gRPc는 양방향 스트리밍, 단방향 스트리밍, 요청/응답 등 다양한 유형을 지원하여 실시간 데이터 전송과 요청/응답이 가능하다.
- 보안 : gRPC는 기본적으로 TLS(Transport Layer Security)를 지원하여 데이터의 안전한 전송을 보장한다.
단점
- 복잡성 : Restful API 보다 비교적 구현하기 복잡하다. (추가적으로 Protocol Buffer에 대해 학습하고 구현하여야함)
- HTTP/2 : HTTP/2의 다중화 및 여러 성능 개선의 이점에 반해, HTTP/2를 지원하지 않는 환경에서는 구현할 수 없다는 제약이 존재한다.
- 가독성 : HTTP 의 경우 사람이 읽고 만들 수 있으나, gRPC 메세지는 Protobuf로 인코딩 되어 송수신에 효율적이지만 사람이 통신 내용을 읽을 수 없다. (.proto 파일에 잘 명시해두어야 함)
위의 장단점을 통해 gRPC에 대한 도입을 고려해볼 수 있다.
gRPC + MSA
위 단락에서 첨부한 마이크로소프트의 내용에도 있듯 MSA와 gRPC는 함께 활용되기 적합하다.
MSA는 서비스를 작은 단위로 쪼개고, 분산시켜 개별적으로 독립적으로 운영하는 패턴이다.
gRPC와 MSA를 연동하는 이유는 다음과 같이 파악하였다.
- 성능 : HTTP/2 프로토콜을 기반으로 하여 다중화와 스트리밍 기능을 제공한다. 이로 인해 MSA 간 통신 성능이 향상된다.
- 스트리밍 지원 : MSA간 실시간 데이터 전송 및 이벤트 처리를 효율적으로 구현할 수 있다.
- 상호 운용성 : 다양한 언어를 지원하여 다른 언어로 개발되어 있어도 통신 가능하다.
- 보안 : TLS를 지원하여 MSA의 보안 요구사항을 충족할 수 있다.
또한, 추가적으로 개인적인 관점에서 MSA와 gRPC는 함께 활용되기 좋은 구조라고 생각한다. MSA는 일반적으로 loosely coupled, 약결합 되어 있으며, 이는 서비스를 완벽하게 분산되도록 구분할 수 없고 일부 연관성을 가진다는 뜻으로 볼 수 있다. 따라서, 마이크로서비스 아키텍처를 채택했을 때 마이크로서비스 간 어떠한 관계가 형성될 수 밖에 없고 이를 보완하기 위한 기술로 gRPC가 적합하다고 생각한다.
'백엔드' 카테고리의 다른 글
Spring Caffeine Async Cache (0) | 2024.04.22 |
---|---|
[Spring Boot] 단위 테스트, 통합 테스트 (0) | 2023.09.25 |
Jackson 라이브러리를 활용한 (역)직렬화 다형성 - JsonTypeInfo / JsonSubTypes (0) | 2023.05.16 |
Kafka-(de)Serialize 에러, ErrorHandlingDeserializer (0) | 2023.03.29 |
Jar VS War (0) | 2022.11.15 |