Remote Procedure Call (RPC)

안녕하세요. 이번시간에는 Remote Procedure Call, RPC에 대해서 공부해볼게요. RPC는요 말그대로 원격에 있는 프로시져를 호출하기위해 만들어진 프로토콜이에요. TCP상에서 통신하는 프로토콜이구요, 분산시스템을 구현하기 위해 개발되었습니다. RPC는 Client-Server model을 사용하고 있는데요. 당연하게 함수를 제공하는 쪽이 서버가 되는거고, 요청하는 쪽이 클라이언트가 되겠죠.

이렇게 해놓으면 뭐가 좋을까요? 일단 필요한 함수를 내가 다 만들어야될 필요가 없겠죠, 각 서비스들이 하나의 공통 함수를 서비스할 RPC서버를 하나 띄워놓고 공용으로 사용하는 프로시져들을 한곳에서 관리할수있어요. 또 다른경우에는 예를 들어 어떤 연산을 처리하는데 수퍼컴퓨터가 필요하다고 치자구요. 그거 현재 돌아가는 서버에서 돌리면 서버 뻗어버리자나요. 그러니까 그런 복잡한 연산은 그 연산을 돌릴수 있는 장비에 띄워놓고 필요할때마다 다른 서비스들이 요청해서 결과를 받아가도록 할수도 있겠죠. 또 이런 경우도 있을거에요. 회사 내부적으로 마이크로 서비스를 구현한 경우에, 각 서비스들이 어떤 특정 data에 대한 ownership을 가지고 있어서, DB에 아무나 막 접속하게 하는것보다 각 서비스들이 제공하는 RPC를 통해서 다른 내부서비스들이 각자 관리하는 데이타를 필요한 만큼만 RPC로 공개하고 다른 서비스들은 데이타의 형식에 구애받지 않고 RPC로만 서로의 데이타를 공유하게 하는거에요.

일단 RPC프로시져를 만들면 해당 프로시져를 서비스할수 있게 만들어야하는데요, 그걸 가능하게 하기위해서 portmapper라는 프로그램을 사용합니다. 어떤 함수를 만들어놓고, 그함수를 특정 포트에 mapping을 해놓으면, 사용자는 portmapper에 접속해서 사용하고자하는 함수가 몇번포트에 열려있는지를 알아낸뒤, 그 포트로 요청해서 연산결과를 받아냅니다. 그리고 rpcinfo라는 명령어를 통해서 어떤 포트가 어느 프로그램에 연동이 되어있는지를 확인할수 있어요.

$ rpcinfo -p localhost
program vers proto   port
100000     2   tcp   111  portmapper
100000     2   udp   111  portmapper
 22855     1   udp   35621 
 22855     1   tcp   56094

위의 결과를 보시면, 현재 portmapper가 111포트에 떠있고, 그 밑으로 22855라는 프로그램이 UDP는 35621포트에, TCP요청은 56094에 mapping이 되어있는걸 확인하실수 있으실거에요. 그런데 22855라는 프로그램이 어떤건지 숫자만봐서는 알기가 힘들잖아요. 그래서 rpcinfo명령어를 쳤을때 해당 서비스가 어떤 서비스인지 힌트를 보여주고 싶다 할때는 /etc/rcp라는 파일을 열어서 그 안에 해당 서비스의 이름과 서비스넘버를 등록하시면 다시 rpcinfo명령어를 실행했을때, 맨 끝에 어떤 프로그램인지 보여줍니다.

$ cat /etc/rpc
...
avg 22855
$ rpcinfo -p localhost
program vers proto   port
100000     2   tcp   111  portmapper
100000     2   udp   111  portmapper
 22855     1   udp   35621  avg
 22855     1   tcp   56094  avg

Source: