반응형
gRPC is a modern open source high performance Remote Procedure Call (RPC) framework that can run in any environment.
RPC(Remote Procedure Call)?
- 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스 간 통신 기술
- 개발자가 원격 상호 작용에 대한 세부 정보를 명시적으로 코딩하지 않아도 프레임워크가 자동 핸들링함
- 클라이언트 코드에서는 직접 서버 코드의 함수를 호출하는 것처럼 보임
- 언어에 구애받지 않고 원격의 프로시져를 호출가능(즉, 클라이언트 코드 언어와 서버 코드 언어가 다른 언어로 쓰일 수 있음 )
gRPC?
- RPC인데 구글이 만든 RPC이다. g가 구글인줄 알았는데 그건 또 아니라고 반박함ㅋㅋㅋ
https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md - IDL: proto 사용
- http/2 기반 통신
- json 기반의 통신보다 가볍고 속도가 빠르다.(성능이점)
- 클라이언트에는 서버와 통신 시 Stub을 inject 하여 통신하며 소스에 바로 로딩하여 사용가능
- protoc 파일을 작성 시 request이나 response앞에 붙은 'stream' 유무에 따라 4가지 방식이 있음
- unary(단방향): 클라이언트가 서버에 단일 요청을 보내고 일반 함수 호출처럼 단일 응답을 받음(1개 request , 1개 respone)
-
rpc SayHello(HelloRequest) returns (HelloResponse);
-
- server stream(서버 스트리밍): 서버가 클라이언트의 요청에 대한 응답으로 메시지 스트림을 반환(1개 request, n개 response)
-
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
-
- client stream(클라이언트 스트리밍): 클라이언트가 단일 메시지 대신 서버에 메시지 스트림을 보냄(n개 request, 1개 response)
-
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
-
- bi-directional(양방향): 서버, 클라이언트 양쪽에서 메시지 스트림을 보냄(n개 request, n개 response)
-
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
-
- unary(단방향): 클라이언트가 서버에 단일 요청을 보내고 일반 함수 호출처럼 단일 응답을 받음(1개 request , 1개 respone)
- 클라이언트 stub: 서버를 추상화해놓은 것 / 클라이언트의 수신처리 방법
- BlockingStub: 동기적으로 통신하는 방법으로, 서버로부터 응답이 올 때까지 대기.
- Unary RPC와 Server Streaming RPC에서만 사용
- AsyncStub (Stub): 비동기적으로 통신하는 방법으로, 서버로부터 오는 응답을 StreamObserver 객체가 대신 받아서 처리
- 모든 방식의 RPC에서 사용
- FutureStub: 비동기적으로 통신하는 방법으로, 서버로부터의 응답 도달에 상관 없이 일단 ListenableFuture로 래핑된 객체를 반환. 서버로부터 오는 응답이 오면 ListenableFuture 객체를 통해 전달받은 메시지를 언래핑할 수 있음.
- Unary RPC에서만 사용
- BlockingStub: 동기적으로 통신하는 방법으로, 서버로부터 응답이 올 때까지 대기.
즉 위 내용을 모두 합치면 아래와 같은 7가지 통신방법이 존재한다.
unary | server stream | client stream | bi-directional | |
blocking | o | o | x | x |
asyn | o | o | o | o |
future | o | x | x | x |
gRPC 단점
- 브라우저에서 직접 gRPC 통신 불가, proxy 를 통하거나 브라우저 -> 클라이언트 연동 서버 -> gRPC 서버 순으로 요청해야 함
- protobuf(이진형식)으로 인코딩되어 송수신에 효율적이나 사람이 읽을 수 없는 데이터라 네트워크 단에서 볼 때 어려움
왜 MSA에서 많이 쓰이나 싶었는데, MSA구조의 특정 상 안 그래도 많은 api 콜을 gRPC로 대체하면 성능 향상에 도움이 될 것 같다..
다음 글에서는 간단하게 서버와 클라이언트를 구현해본다.
2022.01.20 - [개발/spring] - [grpc] springboot2 grpc server/client coding
IDL(Interface Definition Language)?
: 정보를 저장하는 규칙
1. xml
2. json
3. proto
Protocol buffers(proto)?
- 직렬화 데이터 구조, 데이터를 전송할 때 구조화된 데이터를 전환하는 방법 중 하나
- XML의 문제점을 개선하기 위해 제안된 IDL이며, XML보다 월등한 성능을 지님
- .proto 파일에 protocol buffer 메세지 타입/구조를 정의
- message = '이름-값'의 쌍을 포함하는 작은 논리적 레코드
- protoc 컴파일러로 컴파일 하면 데이터에 접근할 수 있는 각 언어에 맞는 형태의 데이터 클래스를 생성해주며 만들어진 클래스는 각 필드를 위한 접근자 뿐 아니라 전체 구조를 바이트로 직렬화하거나 바이트로부터 전체 구조를 파싱하는 메서드들을 제공함
xml 보다..
- XML보다 작고 빠르고 간단함
- 파일 크기가 3에서 10배 정도 작음
- 속도가 20에서 100배 정도 빠름
- XML보다 가독성이 좋고 명시적
참고자료
https://qwer9412.tistory.com/40
728x90
반응형
'architecture > micro service' 카테고리의 다른 글
[inflearn] Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2024.02.18 |
---|---|
[gRPC] gRPC gateway란 (0) | 2022.01.24 |
[arch] DDD pattern 와 aggregate란 (0) | 2022.01.13 |
[cqrs] axon framework란 (0) | 2022.01.12 |
[arch] cqrs란 - 조회와 비조회의 엄연한 분리 (0) | 2022.01.11 |