What is RPC?

RPC는 Remote Procedure Call의 약자입니다. RPC는 프로시저(함수)를 다른 기기에서 실행할 수 있다는 생각에서 출발했습니다. 시살 프로시저는 같은 기기에서 실행되지만, 다른 context에서 사용됩니다. 예를 들면 서로 다른 권한과 수명주기를 가진 사용자 하에서 사용됩니다.

 

What is privilege Separation?

remote code는 다른 사용자 하에서 다른 권한권한을 가진 채 실행됩니다. 사실 remote call은 호출한 사람보다 더 적거나 많은 권한으로 실행될 수 있습니다. 이를 통해 시스템의 보안을 향상시키는 데 사용할 수 있습니다(적은 권한으로 컴포넌트가 실행되는 것을 보장함으로써). 불행하게도 보안 문제는 RPC 메카니즘이 원치 않은 동작을 수행하지 않도록 보장하도록 하여 신중히 다뤄야 합니다. 예를 들어 RPC 수행은 데이터의 부분 집합에 행동들보다 연결된 어떠한 클라이언트가 어떤 행동을 하는 것을 암시적으로 신뢰할 수 있습니다.

 

What is stub code? What is marshalling?

stub 코드란 RPC 수행의 복잡성을 숨기기 위한 코드입니다. stub 코드의 역할 중 하나는 필요한 데이터를 원격 서버로 보낼 수 있는 byte stream의 형태로 만들어주는 marshalling을 해주는 것입니다.

// On the outside 'getHiscore' looks like a normal function call
// On the inside the stub code performs all of the work to send and receive the data to and from the remote machine.

int getHiscore(char* game) {
  // Marshall the request into a sequence of bytes:
  char* buffer;
  asprintf(&buffer,"getHiscore(%s)!", game);

  // Send down the wire (we do not send the zero byte; the '!' signifies the end of the message)
  write(fd, buffer, strlen(buffer) );

  // Wait for the server to send a response
  ssize_t bytesread = read(fd, buffer, sizeof(buffer));

  // Example: unmarshal the bytes received back from text into an int
  buffer[bytesread] = 0; // Turn the result into a C string

  int score= atoi(buffer);
  free(buffer);
  return score;
}

 

What is server stub code? What is unmarshalling?

서버의 stub code는 요청을 받아 요청을 유효한 메모리 데이터로 unmarshalling한 후 기본 구현을 호출하여 요청을 보낸 호출자에게 다시 돌려줍니다.

 

How do you send an int? float? a struct? A linked list? A graph?

RPC를 구현하기 위해서는 데이터를 바이트 순서로 직렬화하는 규칙을 정하고 문서화해야 합니다. 심지어 정수도 몇 가지 공통적인 선택을 해야 합니다.

  • 부호의 유무
  • ASCII
  • 고정된 수의 바이트 또는 크기에 따라 달라지는 변수
  • little endian 또는 big endian

구조체를 marshall하기 위해서는 어떤 field가 직렬화될 필요가 있는지 결정해야 합니다.모든 data item을 보낼 필요는 없습니다 (예를 들어 일부 항목은 특정 RPC에 관련이 없거나 현재 존재하는 다른 데이터가 서버에 의해 다시 계산되는 경우).

 

linked list를 marshall하기 위해서 link pointer를 보낼 필요는 없습니다. 단지 값의 stream만 보내면 됩니다. 서버에서 unmarshalling하는 부분에서 linked list 구조체를 바이트 순서에 맞게 다시 생성할 수 있습니다.

 

head node/vertex에서 시작하여 단순히 트리를 재귀적으로 방문하여 직렬화된 데이터를 만들 수 있습니다. 순환 그래프는 각 edge와 vertex가 정확히 한 번만 처리되기 위해서는 보통 추가적인 메모리를 필요로 합니다.

 

What is an IDL(Interface Description Language)?

stub code를 직접 작성하는 것은 힘들고 지루하고 에러가 발생하기 쉬오며 유지하기도 어렵고 유선 프로토콜에서 구현된 코드를 reverse engineering하기도 어렵습니다. 더 좋은 접근방법은 data object나 메세지, 서비스를 지정하여 자동적으로 클라이언트와 서버 코드를 생성하도록 하는 것입니다.

최근의 IDL의 예로 구글을 프로토콜 버퍼인 .proto 파일을 들 수 있습니다.

 

Transferring large amounts of sturctured data

3가지 다른 포맷(JSON, XML, Google Protocol Buffers)을 이용해 데이터를 전송하는 3가지 방법을 살펴봅시다. JSON과 XML은 텍스트 기본의 프로토콜입니다. JSON과 XML 메세지의 예는 다음과 같습니다.

<ticket><price currency='dollar'>10</price><vendor>travelocity</vendor></ticket>
{ 'currency':'dollar' , 'vendor':'travelocity', 'price':'10' }

Google Protocol buffer는 낮은 CPU 오버헤드와 메모리 복사를 최소화하여 높은 처리량을 보여줄 수 있는 효율적인 오픈 소스 바이너리 프로토콜입니다. Go, Python, C++, C를 포함한 다양한 언어로 구현되었습니다. 즉 여러 언어로 된 클라이언트와 서버 stub 코드를 .proto 사양에 맞춰 데이터와 바이너리 스트림을 마샬링할 수 있습니다.

Google Protocol buffer는 현재 메세지에 알려지지 않은 필드는 무시하여 버전 문제를 줄입니다. 더 자세한 정보는 아래의 protocol buffer의 소개를 봐 주세요.

 

https://developers.google.com/protocol-buffers/docs/overview

Posted by 몰랑&봉봉
,