RPC

RPC

1. RPC?

RPC(Remote Procedure Call) 원격 프로시저 호출이라는 뜻으로 프로세스 간 통신을 지원해주며 IPC 방식 중 하나이다.

별도 원격 제어를 위한 코딩 없이 다른 네트워크에 위치하는 함수나 프로시저를 실행할 수 있게 하는 프로세스 간 통신 기술이다. 즉, 원격 프로시저 호출을 이용하면 프로그래머는 함수가 실행 프로그램이 존재하는 로컬 위치 에 있든, 원격 위치 에 있든 상관 없이 동일한 기능을 수행할 수 있음을 의미한다.

예를 들어, 컴퓨터 A에 “주문하기” 기능을 실행하려고 하는데, 이 기능은 컴퓨터 B에 구현되어 있다. 이때 컴퓨터 A는 RPC를 통해 컴퓨터 B에 있는 “주문하기” 기능을 실행하라고 요청하면, 컴퓨터 B는 “주문하기” 기능을 실행한 결과를 컴퓨터 A에게 보내준다.

함수 vs 프로시저

  • 함수 : Input에 따른 Output 발생을 목적으로 한다. Return 값을 가져가며, Client 단에서 처리되기 때문에 간단한 계산, 수치 등을 도출할 때 사용된다.
  • 프로시저 : 명령 단위가 수행하는 절차 에 집중한 개념. Server 단에서 처리되기 때문에 함수보다 큰 단위의 실행, 프로세싱 등을 할 때 사용된다.

2. RPC 목표

  • 클라이언트 - 서버 간의 커뮤니케이션에 필요한 상세 정보는 최대한 감춘다. (언어나 환경에 구애받지 않는다.)
  • 클라이언트와 서버는 일반 메소드를 호출하는 것처럼 원격의 프로시저를 호출할 수 있다.

3. RPC 동작 방식

stub이란 프로시저 호출을 추상화하는 작은 코드 조각이다. RPC에서 stub은 클라이언트와 서버 사이에 원격 프로시저 호출을 처리하기 위해 사용된다.

  1. 클라이언트가 파라미터를 넘겨 client sub procedure를 호출한다. client stub 은 클라이언트를 소유한 주소 내에 거주한다.
  2. clinet stub 은 파라미터 메시지로 모은다. 모은다의 표현을 표준 포맷으로 변경하고, 각 파라미터를 복사해서 메시지로 넣는 것이다.
  3. clint stub 은 원격 서버 머신으로 메시지를 보내는 계층인 transport layer 로 메시지를 보낸다.
  4. 서버에서 transport layer 는 메시지를 sever stub 으로 보낸다.
  5. server stub 은 결과 값들을 모아서 파라미터 메시지로 모은다.
  6. 서버 프로지서는 sever stub 으로 반환된다.
  7. server stub 은 결과 값들을 모아서 메시지에 넣고, transport layer 로 보낸다.
  8. transport layer 는 해당 결과 메시지를 client transport layer 로 보내고, client transport layer 는 그 결과를 client stub 으로 보낸다.
  9. client stub 은 반환 파라미터들과 실행 결과값을 다시 해체한다.

4. IDL을 이용한 RPC 동작 방식

  1. IDL(Interface Defintion Language) 을 사용하여 서버의 호출 규약을 정의한다.
  2. 함수명, 인자, 반환값에 대한 데이터 형이 저장된 IDL 파일을 rpcgen 컴파일러를 이용하여 stub 코드를 자동으로 생성한다.
  3. stub 은 원시소스코드(c코드 등)의 형태로 만들어지므로 클라이언트, 서버 프로그램에 포함하여 빌드한다.
  4. stub 코드는 데이터형을 XDR(External Data Representation) 형식으로 변환한여 RPC 호출을 실행한다.
  5. 서버는 수신된 함수/프로시저 호출에 대한 처리 완료 후, 결과값을 XDR 변환하여 반환한다.
  6. 최종적으로 클라이언트 프로그램은 서버의 결과값을 반환받는다.

RPC 장단점

  • 하부 네트워크의 프로토콜을 신경쓰지 않아도 되기 때문에, 고유 프로세스 개발 집중이 가능
  • 프로세스간 통신 기능을 비교적 쉽게 구현하고 정교한 제어 가능
  • 호출 실행과 반환 시간이 보장되지 않음
  • 보안이 보장되지 않음

RPC는 구현체가 없어 구현이 어렵다는 단점이 있어, 데이터 통신을 우리에게 익숙한 Web을 활용해보려는 시도로 이어져 REST가 등장했다.