[66해빗 페이백 챌린지] 12일차

tree·2023년 5월 13일
0

RPC

RPC란?

  • Remote Procedure Communication.
  • 별도의 원격 통신 제어에 대한 코딩 없이 다른 주소 공간에 존재하는 프로시저를 실행할 수 있는 프로세스 간 통신 기술(IPC, Inter-Process Communication)
    • 원칙적으로 프로세스는 자신의 주소 공간 내에 존재하는 프로시저만 호출 가능하다.
    • RPC를 사용하면 다른 주소 공간(같은 로컬 시스템의 다른 메모리 주소 공간 또는 원격 시스템에 존재하는 주소 공간)에 있는 프로시저를 호출할 수 있다.
    • 마치 자신의 주소 공간에 존재하는 프로시저를 호출하는 것처럼 다른 주소 공간의 프로시저를 호출할 수 있다.
  • 함수 vs 프로시저
    • 함수
      • input에 따른 output을 가짐.
      • 리턴값이 필수적으로 요구됨.
    • 프로시저
      • 명령 단위의 수행에 집중.
      • 리턴값은 있을 수도 없을 수도 있다.

목표

  • 클라이언트, 서버 간에 커뮤니케이션에 대한 상세 정보는 최대한 감춘다(서로의 언어나 환경이 달라도 개발자는 신경 쓸 필요 없다).
  • 클라이언트는 마치 자신의 주소 공간에 존재하는 프로시저를 호출하듯이 원격의 프로시저를 호출할 수 있다.

사용하는 이유

  • MSA(Micro Service Architecture) 환경에서 자주 사용된다.
    • MSA 컴포넌트가 서로 다른 언어, 환경에서 개발되는 경우가 많은데 이런 차이를 고려한 원격 통신 코드를 작성할 필요가 없어 개발자는 각 컴포넌트의 비즈니스 로직 개발에만 집중할 수 있다.
  • 분산 컴퓨팅 환경에서도 사용된다.

동작 방식

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

장점

  • 개발자는 원격 통신에 대한 고려를 하지 않고 비즈니스 로직 개발에만 집중할 수 있다.
  • 프로세스 간의 통신을 비교적 쉽게 구현 가능

단점

  • 호출 실행과 반환 시간이 보장되지 않음(네트워크 끊김 시 문제 발생)
  • 보안이 보장되지 않음

참고

0개의 댓글