RPC
RPC란?
- Remote Procedure Communication.
- 별도의 원격 통신 제어에 대한 코딩 없이 다른 주소 공간에 존재하는 프로시저를 실행할 수 있는 프로세스 간 통신 기술(IPC, Inter-Process Communication)
- 원칙적으로 프로세스는 자신의 주소 공간 내에 존재하는 프로시저만 호출 가능하다.
- RPC를 사용하면 다른 주소 공간(같은 로컬 시스템의 다른 메모리 주소 공간 또는 원격 시스템에 존재하는 주소 공간)에 있는 프로시저를 호출할 수 있다.
- 마치 자신의 주소 공간에 존재하는 프로시저를 호출하는 것처럼 다른 주소 공간의 프로시저를 호출할 수 있다.
- 함수 vs 프로시저
- 함수
- input에 따른 output을 가짐.
- 리턴값이 필수적으로 요구됨.
- 프로시저
- 명령 단위의 수행에 집중.
- 리턴값은 있을 수도 없을 수도 있다.
목표
- 클라이언트, 서버 간에 커뮤니케이션에 대한 상세 정보는 최대한 감춘다(서로의 언어나 환경이 달라도 개발자는 신경 쓸 필요 없다).
- 클라이언트는 마치 자신의 주소 공간에 존재하는 프로시저를 호출하듯이 원격의 프로시저를 호출할 수 있다.
사용하는 이유
- MSA(Micro Service Architecture) 환경에서 자주 사용된다.
- MSA 컴포넌트가 서로 다른 언어, 환경에서 개발되는 경우가 많은데 이런 차이를 고려한 원격 통신 코드를 작성할 필요가 없어 개발자는 각 컴포넌트의 비즈니스 로직 개발에만 집중할 수 있다.
- 분산 컴퓨팅 환경에서도 사용된다.
동작 방식

- IDL(Interface Definition Language)을 사용해 서버 프로시저의 호출 규약을 작성한다. 함수명, 인자, 리턴값의 데이터 타입을 담은 IDL 파일이 생성된다.
- IDL(Interface Definition Language)
- 인터페이스 정의 언어
- 언어 중립적으로 인터페이스를 표현.
- 구현 언어(C, Java 등)가 아닌 정의 언어.
- 구현 언어로의 매핑을 지원.
- rpcgen 컴파일러는 IDL 파일을 사용해 클라이언트 스텁, 서버 스텁(스켈레톤) 코드를 생성한다. 스텁 코드는 원시 소스파일(C, Java 등)의 형태로 만들어지므로 각각 클라이언트 프로그램, 서버 프로그램에 포함되어 빌드된다.
- 클라이언트 프로세스가 마치 자신의 주소 공간에 존재하는 메소드를 호출하듯이 메소드를 호출하면 stub에 있는 메소드가 호출이 된다.
- 클라이언트 스텁은 클라이언트 프로그램의 주소 공간에 존재한다.
- 클라이언트 스텁은 호출부로부터 전달받은 데이터를 XDR(External Data Representation) 형식으로 변환하여 transport layer로 보내면 transport layer가 서버 프로세스로 메시지를 보낸다.
- 왜 XDR 형식으로 데이터를 변환할까?
- CPU 아키텍처별로 기본 자료형(정수형, 부동소수점 등)에 대한 메모리 저장방식(리틀 엔디안, 빅 엔디안)이 다르다. 데이터 전송 시 바이트 전송 순서를 보장하기 위해서다.
- 메시지를 받은 서버 스텁은 XDR 형식의 데이터를 자신의 시스템에 맞는 데이터로 변환하고 서버 프로세스의 프로시저를 호출한다.
- 서버 프로시저의 리턴값을 다시 XDR로 변환해 클라이언트로 전송.
- 클라이언트 스텁은 XDR 데이터를 변환해 메소드 호출부에 전달.
장점
- 개발자는 원격 통신에 대한 고려를 하지 않고 비즈니스 로직 개발에만 집중할 수 있다.
- 프로세스 간의 통신을 비교적 쉽게 구현 가능
단점
- 호출 실행과 반환 시간이 보장되지 않음(네트워크 끊김 시 문제 발생)
- 보안이 보장되지 않음
참고