[RABBITMQ] RPC(Remote Procedure Call)


원격 프로시져 호출 (RPC)

RabbitMQ는 Request-Response로 Client와 Server를 이어주기 위해 RPC라는 개념으로 기능을 제공한다.

RPC라는 거창한 이름을 사용하였지만 실제로는 Client의 request를 Server에 전달하고 , Server가 처리한 결과를 알맞은 Client 요청에 대한 응답으로 전달 할 수 있는 방법을 말한다.

Message Properties 설명
DeliveryMode : persistent인지 transient인지 표시 (휘발성인지 비휘발성인지 구분자)

ContentType : 내용물의 mime-type

ReplyTo : Callback Queue의 이름

CorrelationID : 요청을 구분할 수 있는 유일값

처리 흐름
Client가 CorrelationID, ReplyTo 주어서 RabbitMQ의 특정 Request보관용 Queue에 데이터를 Push한다.

Request용 Queue에 데이터를 Server에서 Consume하여 요청을 처리한다.

요청처리 후 Request에서 받은 CorrelationID 와 ReplyTo를 추출하여, 요청ID를 속성으로 갖는 Response를 ReplyToQueue에 Push한다.

Client는 ReplyTo Queue를 subscribe하고 있다가 Response가 오면 CorrelationID를 보고 어떤 요청에 대한 응답인지를 구분하여 처리한다.


RPC의 이점

RPC 구조를 응용하면 아래와 같은 상황에 이점을 얻을 수 있다.

서버처리 이점
서버 처리속도가 느려서 성능을 증가 시키려고 할 때, RPC 서버를 하나 더 두고 같은 Request Queue를 바라보게 하면 됨 ( Round Robin 하므로 )

Client 이점
하나의 메시지를 개별 Round Trip으로 처리를 위해 queueDeclare같은 동기처리 요청이 필요없다. (임시 Queue를 생성하여 Client마다 다른 Queue를 사용하므로)

RPC 구성시 고려할 점
돌아가는 서버가 없을 때 Client 처리
요청 Timeout시 Client 처리
서버 Exception이나 오동작시 Client에게 이를 어떻게 전달할지
Invalid한 데이터가 서버로 전달 되었을 때의 처리

공유