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:

  1. Interceptar a chamada de procedimento feita pelo cliente.
  2. Empacotar (Marshalling): Converter os parâmetros da chamada para um formato padrão e independente de máquina, pronto para ser enviado pela rede.
  3. 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:

  1. Receber a mensagem da camada de transporte.
  2. Desempacotar (Unmarshalling): Decodificar a mensagem, convertendo os dados de volta ao formato de parâmetros esperado pelo procedimento local.
  3. Chamar o procedimento real (local) no servidor com os parâmetros desempacotados.
  4. 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.

Referências