RPC
RPC(Remote Procedure call)이란
별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 리모트의 함수나 프로시저를 실행할 수 있게 해주는 프로세스 간 통신이다
즉, 위치에 상관없이 RPC를 통해 개발자는 위치에 상관없이 원하는 함수를 사용할 수 있다.
IPC(inter-process-communication) 프로세스 간 통신을 위한 방법 중 하나이다.
일반적 으로는 프로세스는 자신의 주소 공간 안에 존재하는 함수만 호출하여 실행 가능하다.
하지만, RPC를 이용하면 다른 주소 공간에서 동작하는 프로세스의 함수를 실행할 수 있게 된다.
프로시저와 함수?
함수는 인풋에 대비한 아웃풋의 발생을 목적으로 한다.
프로시저는 결과 값에 집중하기 보단 '명령 단위가 수행하는 절차'를 목적으로 한다.
- 서브루틴 : 실행만 진행 / 함수의 반환 값이 없는 경우 ( 언어마다 의미가 다르다)
-
함수: 입출력이 존재하는 서브모듈
-
메소드: 객체가 소유하는 서브모듈
-
프로시저: 계산 수행 절차에 대한 정확한 기술/묘사를 강조한 용어
RPC의 궁극적인 목표는 무엇일까?
- 클라이언트 - 서버간의 커뮤니케이션에 필요한 상세한 정보는 최대한 감춘다
- 클라이언트는 일반 메서드를 호출하는 것처럼 호출하면 된다.
- 서버도 마찬가지로 일반 메서드를 다루는 것처럼 한다.

Caller / Callee
- 사용자(Client / Server)가 필요한 비즈니스 로직을 작성하는 Layer
- IDL(interface definition language)로 작성
Stub
- Stub Compiler가 IDL 파일을 읽어 원하는 Language로 생성.
- 서버가 이해할 수 있는 형태로 데이터의 캐스팅 진행하고, 서버 측 RPC로 호출을 진행
- Parameter Object를 Message로 marshalling/unmarshalling하는 Layer
IDL (Interface definition language)
어느 한 언어에 국한되지 않는 언어 중립적인 방법으로 인터페이스를 표현함으로써, 같은 언어를 사용하지 않는 소프트웨어 컴포넌트 사이의 통신을 가능하게 함.
Marshalling / Unmarshalling
메모리에 존재하는 객체를 범용적인 파일이나 바이트 스트림으로 변환하는 작업을 Marshalling이라고 부르고, 거꾸로 스트림이나 파일로부터 객체를 만들어내는 작업을 Unmarshalling이라고 부른다.
Serialize || Marsahlling 차이
serialize
구조화된 객체를 가져와 복사하여 byte stream으로 변환하는 것으로 주로 네트워크 간의 데이터를 주고받을 때 유용하다
marshalling
데이터 코드 베이스를 기반으로 가져와 만드는 것이라고 보면 될 것같다. 그래서 주로 marshalling은 다른 언어 혹은 다른 플랫폼에서 서로 데이터를 주고받을 때 사용한다.
RPC RunTime
- Server와 Client를 Binding하는 Layer
- 커뮤니케이션 중 발생한 에러 처리도 진행
RPC는 어떻게 서버와 클라이언트를 연결할까?
클라이언트는 누구를 호출해야 할지 어떻게 알고 서비스가 위치한 곳을 어떻게 알까?
가장 유연한 해결법은 동적 바인딩을 사용하고 RPC가 처음 만들어졌을 때 런타임에 서버를 찾는 것이다.
클라이언트 Stub이 처음 호출됐을 때, 서버가 있는 곳에 transport address를 결정하기 위해 네임 서버에 접근한다.
- Static Binding
- 서버 주소 Hard Coding
- 간단하고 효율적
- 서버 주소 변경에 약함.
- Dynamic Binding
- 주소 변경에 매우 유동적
- 여분의 서버를 둬야 하는 단점.
- Name Server
- Load Balancer

RPC의 동작 방식

- 클라이언트가 일반적인 방식으로 파라미터를 넘겨 client stub procedure를 호출한다.
client stub은 클라이언트를 소유한 주소의 공간 내에 거주한다. - client stub이 파라미터들을 메세지로 모은다.
여기서 모은다는 것에 파라미터의 표현을 표준 포맷으로 변경하고 각 파라미터를 복사해서 메시지로 넣는 것도 포함된다. - client stub은 원격 서버 머신으로 메세지를 보내는 계층인 transport layer로 메세지를 보낸다.
- 서버에서, transport layer는 메세지를 server stub으로 보낸다.
server stub은 또 파라미터들을 모아주고 일반적인 프로시저 호출 메커니즘을 사용하여 요구된 서버 루틴을 호출한다. - 서버 프로시저가 완료될 때, 서버 프로시저는 server stub으로 반환된다.
(이를테면 일반적인 프로시저 호출 반환 값을 통해), server stub은 결과 값들을 모아서 메시지에 넣고, transport layer에 메시지를 보낸다. - transport layer는 결과 메세지를 다시 client transport layer로 보내고 client transport layer는 그 결과를 또 client stub에게 전달한다.
- client stub은 반환 파라미터들과 실행 결괏값을 다시 해체한다.\
IDL을 이용한 동작 방식 설명

- IDL(Interface Definition Language)을 사용하여 서버의 호출 규약을 정의한다.
함수명, 인자, 반환 값에 대한 데이터 형이 저장된 IDL 파일을 rpcgen 컴파일러를 이용하여 stub 코드를 자동으로 생성한다. - Stub은 원시 소스코드 (C 코드 등)의 형태로 만들어지므로 클라이언트, 서버 프로그램에 포함하여 빌드한다.
- 클라이언트 프로그램 입장에서 자신의 프로세스 주소 공간의 함수를 호출하는 것처럼 동일하게 stub에 정의된 함수를 호출할 수 있게 된다.
- stub 코드는 데이터형을 XDR(External Data Representation) 형식으로 변환하여 RPC를 호출을 실행한다.
XDR 변환 이유는 기본 데이터 타입(정수형, 부동소수점 등)에 대한 메모리 저장 방식(리틀 엔디안, 빅 엔디안)이 CPU 아키텍처별로 다르며, 네트워크 전송 과정에서 바이트 전송 순서를 보장하기 위함이다.
- 서버는 수신된 함수/프로시저 호출에 대한 처리 완료 후, 결괏값을 XDR 형식으로 변환하여 반환한다.
- 최종적으로 클라이언트 프로그램은 서버의 결과값을 반환받는다.
External Data Representation (XDR)을 사용하는 이유?
(XDR : 외부 데이터 표현 방식)
클라이언트의 요청은 XDR이라는 이름을 가진 필터를 통과해서 인코딩이 된 이후에 전달이 된다.
이때 컴퓨터마다 계산 처리 방식이 다르기 때문에, 표준화 처리 작업이 필요하게 된다.
그래서 등장한 것이 XDR이며
이를 통해서 서로 다른 컴퓨터에서도 데이터가 정확히 해석될 수 있도록 한다.
RPC가 UDP를 쓰는 이유
메시지의 크기가 작고, 패킷이 깨질 확률이 낮다.
sesseion connection의 오버헤드가 있다.
많은 client를 support 하는데 connection에 따른 state 정보를 모두 유지하는 건 비효율적이다.
그래서 state를 저장하지 않는 UDP는 Fail handling(recover)이 쉽다.
OSI 7 Layer
7. application Layer = NFS
NFS
네트워크에 파일을 저장하는 메커니즘이다. 이 시스템은 사용자가 원격 컴퓨터에 있는 파일 및 디렉터리에 액세스 할 수 있고 해당 파일 및 디렉터리가 로컬에 있는 것처럼 처리하도록 허용하는 분산 파일 시스템이다.
6. persentation Layer = XDR (인코딩)
5. session Layer = RPC (세션 연결)
4. transport Layer = TCP/UDP (대부분 UDP)
3. network Layer = IP
2. dataLink Layer = ethernet
1. physical Layer
RPC의 장점
- 비즈니스 로직에 집중할 수 있음.
- 다양한 언어를 가진 환경에서 쉽게 확장할 수 있음.
- 쉽게 인터페이스 협업이 가능함.
RPC의 단점
- 새로운 학습 비용이 듦.
- 사람의 눈으로 읽기 힘듦
- 서버 간의 통신에서 사용하기 적합
- 호출 실행과 반환 시간이 보장되지 않음 (네트워크 구간을 통하여 RPC 통신을 하는 경우, 네트워크가 끊겼을 때 치명적 문제 발생)
- 보안이 보장되지 않음
'GRPC' 카테고리의 다른 글
GRPC 란? (0) | 2022.05.21 |
---|---|
ProtoBuf 란 ? (0) | 2022.05.05 |
HTTP2 란 ? (0) | 2022.05.03 |