Remote Procedure Call - RPC
1. O que é RPC?
O RPC (Remote Procedure Call, ou Chamada de Procedimento Remoto) é um mecanismo que permite que um processo em uma máquina invoque um procedimento (uma função ou método) em outra máquina, como se fosse uma chamada local.
O objetivo principal do RPC é fornecer transparência de distribuição: o desenvolvedor que realiza a chamada não precisa se preocupar com a comunicação de rede subjacente (gerenciamento de sockets, protocolos, etc.).
2. O Papel do Stub
O Stub é o componente de software fundamental que torna a transparência do RPC possível. Ele atua como um proxy (substituto) local para o procedimento remoto.
Existem dois stubs envolvidos em uma comunicação RPC:
2.1. Stub Cliente (Proxy)
Reside na máquina cliente (quem faz a chamada). Suas funções são:
- Interceptar a chamada de procedimento feita pelo cliente.
- Empacotar (Marshalling): Converter os parâmetros da chamada para um formato padrão e independente de máquina, pronto para ser enviado pela rede.
- Encaminhar a mensagem para a camada de transporte (RPC-Runtime ou Sistema Operacional) para envio.
2.2. Stub Servidor (Esqueleto)
Reside na máquina servidora (onde o procedimento é executado). Também é conhecido como Esqueleto (Skeleton). Suas funções são:
- Receber a mensagem da camada de transporte.
- Desempacotar (Unmarshalling): Decodificar a mensagem, convertendo os dados de volta ao formato de parâmetros esperado pelo procedimento local.
- Chamar o procedimento real (local) no servidor com os parâmetros desempacotados.
- Após a execução, empacotar o resultado e enviá-lo de volta ao cliente (seguindo o fluxo inverso).
3. Fluxo de uma Chamada RPC
O diagrama abaixo ilustra a sequência completa de uma chamada RPC, mostrando a interação entre o cliente, os stubs e o servidor.
sequenceDiagram
participant Cliente
participant Stub Cliente
participant RPC-Runtime (Cliente)
participant RPC-Runtime (Servidor)
participant Stub Servidor
participant Servidor (Procedimento)
Cliente->>Stub Cliente: 1. Chama procedimento(args)
Stub Cliente->>Stub Cliente: 2. Marshalling (Empacotamento dos args)
Stub Cliente->>RPC-Runtime (Cliente): 3. Envia mensagem
RPC-Runtime (Cliente)->>RPC-Runtime (Servidor): 4. Comunicação de Rede
RPC-Runtime (Servidor)->>Stub Servidor: 5. Entrega mensagem
Stub Servidor->>Stub Servidor: 6. Unmarshalling (Desempacotamento)
Stub Servidor->>Servidor (Procedimento): 7. Chama procedimento_local(args)
Servidor (Procedimento)-->>Stub Servidor: 8. Retorna resultado
Stub Servidor->>Stub Servidor: 9. Marshalling (Resultado)
Stub Servidor->>RPC-Runtime (Servidor): 10. Envia resposta
RPC-Runtime (Servidor)->>RPC-Runtime (Cliente): 11. Comunicação de Rede (Resposta)
RPC-Runtime (Cliente)->>Stub Cliente: 12. Entrega resposta
Stub Cliente->>Stub Cliente: 13. Unmarshalling (Resultado)
Stub Cliente-->>Cliente: 14. Retorna resultado ao cliente
4. Conceitos-Chave
- Marshalling (Empacotamento): O processo de serialização. Converte os dados (parâmetros ou resultados) de sua representação na memória para um formato padronizado (como uma stream de bytes), adequado para transmissão pela rede.
- Unmarshalling (Desempacotamento): O processo inverso. Converte os dados do formato de rede de volta para sua representação original na memória da máquina receptora.
- Transparência de Acesso: O stub esconde as diferenças de representação de dados entre máquinas (ex: little-endian vs. big-endian) e a própria existência da rede.