Chiamata di procedura remota - Remote procedure call

Nel calcolo distribuito , una chiamata di procedura remota ( RPC ) è quando un programma per computer fa eseguire una procedura ( subroutine ) in uno spazio di indirizzi diverso (comunemente su un altro computer su una rete condivisa), che è codificato come se fosse un normale ( local), senza che il programmatore codifichi esplicitamente i dettagli per l'interazione remota. Cioè, il programmatore scrive essenzialmente lo stesso codice sia che la subroutine sia locale al programma in esecuzione o remota. Questa è una forma di interazione client-server (il chiamante è il client, l'esecutore è il server), tipicamente implementato tramite un sistema di scambio di messaggi di richiesta-risposta. Nel paradigma della programmazione orientata agli oggetti, le RPC sono rappresentate da remote method invocation (RMI). Il modello RPC implica un livello di trasparenza della posizione , vale a dire che le procedure di chiamata sono sostanzialmente le stesse sia locali che remote, ma di solito non sono identiche, quindi le chiamate locali possono essere distinte dalle chiamate remote. Le chiamate remote sono in genere ordini di grandezza più lente e meno affidabili delle chiamate locali, quindi è importante distinguerle.

Gli RPC sono una forma di comunicazione interprocesso (IPC), in quanto processi diversi hanno spazi di indirizzi diversi: se sulla stessa macchina host, hanno spazi di indirizzi virtuali distinti, anche se lo spazio di indirizzi fisico è lo stesso; mentre se si trovano su host diversi, lo spazio degli indirizzi fisici è diverso. Molte tecnologie diverse (spesso incompatibili) sono state utilizzate per implementare il concetto.

Storia e origini

I protocolli richiesta-risposta risalgono ai primi computer distribuiti alla fine degli anni '60, le proposte teoriche di chiamate di procedura remota come modello di operazioni di rete risalgono agli anni '70 e le implementazioni pratiche risalgono ai primi anni '80. Bruce Jay Nelson è generalmente accreditato per aver coniato il termine "chiamata di procedura remota" nel 1981.

Le chiamate di procedura remota utilizzate nei moderni sistemi operativi risalgono al sistema di multiprogrammazione RC 4000 , che utilizzava un protocollo di comunicazione richiesta-risposta per la sincronizzazione dei processi. L'idea di trattare le operazioni di rete come chiamate di procedura remota risale almeno agli anni '70 nei primi documenti di ARPANET . Nel 1978, Per Brinch Hansen propose i Processi Distribuiti, un linguaggio per il calcolo distribuito basato su "richieste esterne" consistenti in chiamate di procedura tra processi.

Una delle prime implementazioni pratiche è stata nel 1982 da Brian Randell e colleghi per la loro connessione di Newcastle tra macchine UNIX. Questo fu presto seguito da "Lupin" di Andrew Birrell e Bruce Nelson nell'ambiente Cedar allo Xerox PARC . Lupin ha generato automaticamente stub, fornendo collegamenti type-safe e ha utilizzato un protocollo efficiente per la comunicazione. Uno dei primi usi aziendali di RPC è stato da parte di Xerox con il nome "Courier" nel 1981. La prima implementazione popolare di RPC su Unix è stata l'RPC di Sun (ora chiamato ONC RPC), utilizzato come base per Network File System (NFS).

Negli anni '90, con la popolarità della programmazione orientata agli oggetti , è stato ampiamente implementato un modello alternativo di invocazione del metodo remoto (RMI), come nella Common Object Request Broker Architecture (CORBA, 1991) e nella chiamata del metodo remoto Java . Le RMI a loro volta sono diminuite in popolarità con l'ascesa di Internet, in particolare negli anni 2000.

Passaggio di messaggi

RPC è un protocollo di richiesta-risposta . Un RPC viene avviato dal client , che invia un messaggio di richiesta a un server remoto noto per eseguire una procedura specificata con i parametri forniti. Il server remoto invia una risposta al client e l'applicazione continua il suo processo. Mentre il server elabora la chiamata, il client viene bloccato (aspetta che il server abbia terminato l'elaborazione prima di riprendere l'esecuzione), a meno che il client non invii una richiesta asincrona al server, ad esempio XMLHttpRequest . Ci sono molte varianti e sottigliezze in varie implementazioni, risultando in una varietà di protocolli RPC differenti (incompatibili).

Un'importante differenza tra le chiamate di procedura remota e le chiamate locali è che le chiamate remote possono non riuscire a causa di problemi di rete imprevedibili. Inoltre, i chiamanti in genere devono gestire tali errori senza sapere se la procedura remota è stata effettivamente invocata. Le procedure idempotenti (quelle che non hanno effetti aggiuntivi se chiamate più di una volta) sono facilmente gestibili, ma rimangono abbastanza difficoltà che il codice per chiamare le procedure remote è spesso limitato a sottosistemi di basso livello accuratamente scritti.

Sequenza di eventi

  1. Il client chiama lo stub del client . La chiamata è una chiamata di procedura locale, con i parametri inseriti nello stack nel modo normale.
  2. Lo stub del client racchiude i parametri in un messaggio ed effettua una chiamata di sistema per inviare il messaggio. L'impacchettamento dei parametri è chiamato marshalling .
  3. Il sistema operativo locale del client invia il messaggio dalla macchina client alla macchina server.
  4. Il sistema operativo locale sulla macchina server passa i pacchetti in arrivo allo stub del server .
  5. Lo stub del server decomprime i parametri dal messaggio. La decompressione dei parametri è chiamata unmarshalling .
  6. Infine, lo stub del server chiama la procedura del server. La risposta ripercorre gli stessi passi in senso inverso.

Meccanismi di contatto standard

Per consentire a diversi client di accedere ai server, sono stati creati numerosi sistemi RPC standardizzati. La maggior parte di questi utilizza un linguaggio di descrizione dell'interfaccia (IDL) per consentire a varie piattaforme di chiamare l'RPC. I file IDL possono quindi essere utilizzati per generare codice per l'interfaccia tra client e server.

analoghi

Notevoli implementazioni e analoghi RPC includono:

Specifico della lingua

  • Java s' Java Remote Method Invocation API (Java RMI) fornisce una funzionalità simile ai metodi Unix RPC standard.
  • Go fornisce il pacchetto rpc per l'implementazione di RPC, con supporto per le chiamate asincrone.
  • Gli oggetti di rete di Modula-3 , che erano la base per l'RMI di Java
  • RPyC implementa meccanismi RPC in Python, con supporto per chiamate asincrone.
  • Distributed Ruby (DRb) consente ai programmi Ruby di comunicare tra loro sulla stessa macchina o su una rete. DRb utilizza l'invocazione del metodo remoto (RMI) per passare comandi e dati tra i processi.
  • Erlang è orientato ai processi e supporta nativamente la distribuzione e gli RPC tramite il passaggio di messaggi tra nodi e processi locali.
  • Elixir si basa sulla Erlang VM e consente la comunicazione di processo (processi Elixir/Erlang, non processi OS) della stessa rete out-of-the-box tramite agenti e scambio di messaggi.

Specifico per l'applicazione

Generale

  • NFS ( Network File System ) è uno degli utenti più importanti di RPC
  • Open Network Computing Remote Procedure Call , di Sun Microsystems
  • Il programma IPC open source D-Bus fornisce una funzione simile a CORBA .
  • SORCER fornisce l'API e il linguaggio orientato all'esercizio (EOL) per l'invocazione di un metodo federato
  • XML-RPC è un protocollo RPC che utilizza XML per codificare le sue chiamate e HTTP come meccanismo di trasporto.
  • JSON-RPC è un protocollo RPC che utilizza messaggi con codifica JSON
  • JSON-WSP è un protocollo RPC che utilizza messaggi con codifica JSON
  • SOAP è un successore di XML-RPC e utilizza anche XML per codificare le sue chiamate basate su HTTP.
  • ZeroC s' Internet Communications Engine (ICE) distribuito piattaforma di elaborazione.
  • Etch framework per la creazione di servizi di rete.
  • Protocollo e framework Apache Thrift .
  • CORBA fornisce l'invocazione di procedure remote attraverso un livello intermedio chiamato object request broker .
  • Libevent fornisce un framework per la creazione di server e client RPC.
  • Windows Communication Foundation è un'interfaccia di programmazione delle applicazioni nel framework .NET per la creazione di applicazioni connesse e orientate ai servizi.
  • Microsoft .NET Remoting offre funzionalità RPC per sistemi distribuiti implementati sulla piattaforma Windows. È stato sostituito da WCF .
  • Microsoft DCOM utilizza MSRPC che è basato su DCE/RPC
  • L' ambiente di calcolo distribuito DCE/RPC di Open Software Foundation (anch'esso implementato da Microsoft).
  • Il pacchetto Google Protocol Buffers (protobufs) include un linguaggio di definizione dell'interfaccia utilizzato per i suoi protocolli RPC open source nel 2015 come gRPC .
  • WAMP combina RPC e Pubblica-Sottoscrivi in un unico protocollo indipendente dal trasporto.
  • Google Web Toolkit utilizza un RPC asincrono per comunicare con il servizio server.
  • Apache Avro fornisce RPC in cui client e server scambiano schemi nell'handshake della connessione e nella generazione del codice non sono richiesti.
  • Embedded RPC è un'implementazione RPC leggera sviluppata da NXP, destinata ai core CortexM primari
  • KF Trusted Execution Environment utilizza il proxy e il marshalling degli oggetti per comunicare gli oggetti attraverso le sandbox
  • msgpack-rpc è un'implementazione RPC leggera che utilizza MessagePack per serializzare i dati. Viene utilizzato nell'editor di testo Neovim .

Guarda anche

Riferimenti

link esterno