Programação Concorrente e Distribuída

RPC — Remote Procedure Call

Aula 10 — Chamando procedimentos à distância
Prof. Newton S. B. Miyoshi
newton.miyoshi@baraodemaua.br
Centro Universitário Barão de Mauá — Ribeirão Preto
Parte 1

O que é RPC?

Fazer uma chamada de função parecer local, mesmo estando em outra máquina.

RPC — Remote Procedure Call

  • Chamar um procedimento (função) remotamente, como se fosse local.
  • Ideia simples, porém a implementação tem dificuldades:
    • Como tratar a passagem de parâmetros?
    • Como tratar falhas na rede ou nos nós?
    • Como lidar com cada parte do objeto estar em nós e espaços de memória diferentes?

RPC — Operação básica

  • Uma chamada remota deve ser muito parecida com uma chamada local.
  • Ex.: dar append em dados de um banco e retornar uma lista de valores:
newlist = append(data, dbList)

Como seria um RPC disso? Uma chamada para um stub do cliente empacota os parâmetros em uma mensagem enviada ao servidor; o stub do servidor recebe, desempacota, faz a chamada na implementação do append e faz o caminho de volta.

RPC — Operação básica

Linha do tempo de uma chamada RPC: cliente chama o procedimento remoto e espera o resultado, servidor recebe o request, executa e responde
O cliente espera o resultado como numa chamada comum — a rede fica escondida atrás do stub.

Arquitetura de um RPC: stubs cliente e servidor

Cliente e servidor com camadas de funções, stub e rotinas de rede, se comunicando através do kernel
O stub empacota (marshal) a chamada em uma mensagem; as rotinas de rede do kernel cuidam do transporte até o outro lado.

Passo a passo de um RPC

Seis passos de um RPC: chamada do cliente, stub monta mensagem, envio pela rede, SO entrega ao stub do servidor, stub desempacota, chamada local
1) chamada do cliente · 2) o stub monta a mensagem · 3) ela viaja pela rede · 4–5) o SO do servidor entrega ao stub, que desempacota · 6) chamada local de verdade.

Suporte ao RPC

Há duas formas de permitir o desenvolvimento com RPC:

1 · Stubs gerados

O desenvolvedor define exatamente o que pode ser chamado remotamente, e os stubs de cliente e servidor são gerados.

2 · Suporte da linguagem

A chamada remota de procedimento faz parte do próprio ambiente da linguagem de programação.

Suporte ao RPC — Geração de Stubs

  • É necessário concordar com a forma de troca de mensagens:
    • Tipo de conexão (ex.: TCP/IP)
  • Definição e geração de stubs:
    • IDL — Interface Definition Language
    • Compilada para a linguagem específica

Suporte ao RPC — Baseado nas linguagens

  • A própria linguagem de programação dá suporte a RPC: simplifica a implementação e traz alta transparência.
  • Ex.: Java RMI (Remote Method Invocation) — um cliente na sua JVM invoca um método em um objeto que está em outra JVM, remota.
  • Ex.: Python — RPyC.
  • Desvantagem: as duas pontas precisam usar a mesma linguagem (ex.: Java nos dois nós).
Parte 2

Implementação de RPC

RPyC e gRPC na prática.

Exemplo prático

RPC na prática: notificar um pagamento

💰
Pagamentocliente paga no app
🔔
RPC: notificarPagamentocliente, produto, valor, status
✉️ E-mail
💬 WhatsApp
💭 Chat
📱 SMS / Push

RPyC — dois modelos

Modo Clássico

  • Server slaves
  • Modelo simétrico — o cliente tem controle total do servidor

Modelo de Serviços

  • O servidor define os serviços
  • O cliente chama os serviços expostos

RPyC — Modo Clássico

$ ./rpyc_classic.py -m threaded -p 12333
INFO:SLAVE/12333:server started on [0.0.0.0]:12333
INFO:SLAVE/12333:accepted 127.0.0.1:34044
INFO:SLAVE/12333:welcome [127.0.0.1]:34044
INFO:SLAVE/12333:goodbye [127.0.0.1]:34044
^C
WARNING:SLAVE/12333:keyboard interrupt!
INFO:SLAVE/12333:server has terminated
INFO:SLAVE/12333:listener closed

ou, chamando o script diretamente com Python:

$ python bin/rpyc_classic.py
INFO:SLAVE/18812:server started on [127.0.0.1]:18812

RPyC Services

  • Implementação de serviços com servidores.
  • Clientes consomem os serviços expostos via RPC.
Google

gRPC

Framework de RPC de alto desempenho, open-source, que usa Protocol Buffers como IDL e HTTP/2 como transporte.

Um serviço gRPC em C++ atendendo stubs em Ruby e em Android/Java
Um servidor gRPC pode atender clientes em outras linguagens — o stub gerado cuida da tradução.

gRPC Conceitos

  • Serviços (no servidor) definem métodos que podem ser chamados remotamente — com parâmetros e retorno.
    • Protocol Buffers como IDL (Interface Definition Language)
  • Existem 4 tipos de serviços.
1 · Serviços Unários

Requisição / Resposta

💻
Cliente
📄 requisição →
← 📄 resposta
🖥️
Servidor

O clássico "um pergunta, um responde" — como uma chamada de função comum.

2 · Server Streaming

Requisição / Streaming de Resposta

💻
Cliente
📄 requisição →
← 📄 📄 📄 (stream)
🖥️
Servidor

Uma requisição, várias respostas conforme ficam prontas — ex.: acompanhar um pedido em tempo real.

3 · Client Streaming

Streaming de Requisição / Resposta

💻
Cliente
📄 📄 📄 (stream) →
← 📄 resposta
🖥️
Servidor

Várias requisições enviadas aos poucos, uma única resposta no final — ex.: upload de arquivo em partes.

4 · Streaming Bidirecional

Streaming de Requisição / Streaming de Resposta

💻
Cliente
📄 📄 📄 (stream) →
← 📄 📄 📄 (stream)
🖥️
Servidor

Os dois lados enviam e recebem ao mesmo tempo, de forma independente — ex.: chat em tempo real.

Referências bibliográficas

  • TANENBAUM, A. S.; VAN STEEN, M. Distributed Systems. 3. ed. 2018 — Cap. 4. ISBN 978-90-815406-2-9. distributed-systems.net