본문 바로가기
GRPC

RPC 란?

by Box 2022. 5. 1.
728x90

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의 동작 방식

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

IDL을 이용한 동작 방식 설명 

  1. IDL(Interface Definition Language)을 사용하여 서버의 호출 규약을 정의한다.
    함수명, 인자, 반환 값에 대한 데이터 형이 저장된 IDL 파일을 rpcgen 컴파일러를 이용하여 stub 코드를 자동으로 생성한다.
  2. Stub은 원시 소스코드 (C 코드 등)의 형태로 만들어지므로 클라이언트, 서버 프로그램에 포함하여 빌드한다.
  3. 클라이언트 프로그램 입장에서 자신의 프로세스 주소 공간의 함수를 호출하는 것처럼 동일하게 stub에 정의된 함수를 호출할 수 있게 된다.
  4. stub 코드는 데이터형을 XDR(External Data Representation) 형식으로 변환하여 RPC를 호출을 실행한다.
 XDR 변환 이유는 기본 데이터 타입(정수형, 부동소수점 등)에 대한 메모리 저장 방식(리틀 엔디안, 빅 엔디안)이 CPU 아키텍처별로 다르며, 네트워크 전송 과정에서 바이트 전송 순서를 보장하기 위함이다.

  1. 서버는 수신된 함수/프로시저 호출에 대한 처리 완료 후, 결괏값을 XDR 형식으로 변환하여 반환한다.
  2. 최종적으로 클라이언트 프로그램은 서버의 결과값을 반환받는다.

 


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