Remote Procedure Call (RPC)
Was ist ein Remote Procedure Call (RPC)?
Ein Remote Procedure Call (RPC), zu Deutsch entfernter Prozeduraufruf, ist ein Software-Kommunikationsprotokoll, das ein Programm verwendet, um einen Dienst von einem anderen Programm anzufordern, das sich auf einem anderen Computer und in einem anderen Netzwerk befindet, ohne die Details des Netzwerks verstehen zu müssen. RPC wird insbesondere verwendet, um andere Prozesse auf entfernten Systemen aufzurufen, als ob der Prozess ein lokales System wäre. Ein Prozeduraufruf wird manchmal auch als Funktionsaufruf (Function Call) oder Unterprogrammaufruf (Subroutine Call) bezeichnet.
RPC funktioniert wie ein Low-Level-Transportprotokoll für die Übertragung von Datenpaketen zwischen kommunizierenden Programmen. Es verwendet dazu ein Client-Server-Modell. Das anfragende Programm wird als Client bezeichnet, während das dienstleistende Programm als Server bezeichnet wird. Wie ein lokaler Prozeduraufruf ist ein RPC eine synchrone Operation, bei der das anfragende Programm angehalten werden muss, bis die Ergebnisse der entfernten Prozedur zurückgegeben werden. Durch die Verwendung von leichtgewichtigen Prozessen oder Threads, die sich denselben Adressraum teilen, können jedoch mehrere RPCs gleichzeitig ausgeführt werden.
Die Schnittstellendefinitionssprache (Interface Definition Language, IDL) – die Spezifikationssprache, die zur Beschreibung der Programmierschnittstelle (API) einer Softwarekomponente verwendet wird – wird üblicherweise in RPC-Software eingesetzt. In diesem Fall bildet IDL eine Brücke zwischen den Rechnern an beiden Enden der Verbindung, die unterschiedliche Betriebssysteme und Computersprachen verwenden können. Dies bedeutet, dass RPC auf Betriebssystemen wie Windows, Unix und macOS verwendet werden kann.
Wozu dient RPC?
RPC wird häufig für den Aufbau und die Interaktion mit verteilten Systemen verwendet. RPC ermöglicht es einem Programm, ein Unterprogramm auf einem anderen Computer aufzurufen, ohne dass es weiß, dass es entfernt ist. Obwohl sich RPC wie ein Transportprotokoll verhält, handelt es sich in Wirklichkeit um ein prozessübergreifendes Kommunikationsverfahren.
Wenn eine Programmanweisung oder ein Befehl, der das RPC-Framework verwendet, in ein ausführbares Programm kompiliert wird, wird ein Stub eingefügt. Ein Stub ist ein Stück Code, das zur Umwandlung von Parametern verwendet wird, die zwischen einem Client und einem Server übergeben werden. Der Stub fungiert als Repräsentant des Remote Procedure Codes. Wenn das Programm ausgeführt und der Prozeduraufruf getätigt wird, empfängt der Stub die Anfrage und leitet sie an ein Client-Laufzeitprogramm auf dem lokalen Computer weiter. Wenn der Client-Stub zum ersten Mal aufgerufen wird, kontaktiert er einen Nameserver, um die Transportadresse zu ermitteln, unter der sich der Server befindet.
Das Client-Laufzeitprogramm weiß, wie der entfernte Computer und die Serveranwendung zu adressieren sind, und sendet die Nachricht, die die entfernte Prozedur anfordert, über das Netzwerk. In ähnlicher Weise enthält der Server ein Laufzeitprogramm und einen Stub, der die Schnittstelle zur entfernten Prozedur selbst bildet. Response-Request-Protokolle werden auf die gleiche Weise zurückgesendet.
Wie funktioniert RPC?
Beim Aufruf einer entfernten Prozedur wird zunächst die aufrufende Umgebung angehalten. Die Parameter der Prozedur werden dann über das Netzwerk an das Gerät übertragen, auf dem die Prozedur ausgeführt werden soll. Danach beginnt die Ausführung der Prozedur in dieser Umgebung.
Wenn die Prozedur abgeschlossen ist, werden die Daten zurück in die aufrufende Umgebung übertragen, wo die Programmausführung fortgesetzt wird, als ob sie von einem normalen Prozeduraufruf zurückgekehrt wäre.
Die folgenden Schritte laufen bei einem RPC ab:
- Der Client ruft den Client-Stub auf. Der Aufruf ist ein lokaler Prozeduraufruf mit Parametern, die auf die übliche Weise auf den Stack gelegt werden.
- Der Client-Stub packt die Prozedurparameter in eine Nachricht und macht einen Systemaufruf, um die Nachricht zu senden. Das Verpacken der Prozedurparameter wird als marshaling bezeichnet.
- Das lokale Betriebssystem des Clients sendet die Nachricht vom Client-Gerät an das entfernte Server-Gerät.
- Die Transportschicht des Server-Betriebssystems leitet die eingehenden Pakete an den Server-Stub weiter.
- Der Server-Stub entpackt die Parameter aus der Nachricht, was als unmarshaling bezeichnet wird.
- Wenn die Server-Prozedur beendet ist, kehrt sie zum Server-Stub zurück und fasst die Rückgabewerte in einer Nachricht zusammen. Der Server-Stub sendet die Nachricht dann an die Transportschicht.
- Die Transportschicht sendet die Nachricht an die Client-Transportschicht, die die Nachricht dann an den Client-Stub zurückschickt.
- Der Client-Stub gibt die Rückgabeparameter frei und die Ausführung kehrt zum Aufrufer zurück.
RPC kann auch so modifiziert werden, dass es in anderen Umgebungen, zum Beispiel in Microservices, effektiv funktioniert.
Arten von RPC
Es gibt verschiedene RPC-Modelle und Implementierungen des Distributed Computings. Ein beliebtes Modell und eine Implementierung ist die Distributed Computing Environment der Open Software Foundation. Das Institute of Electrical and Electronics Engineers definiert RPC in seiner ISO-RPC-Spezifikation ISO/IEC 11578:1996.
Beispiele für RPC-Konfigurationen sind
- Synchron. Dies ist die Standardmethode von RPC. Der Client tätigt einen Aufruf und wartet auf eine Antwort des Servers.
- Nicht blockierend. Der Client tätigt einen Aufruf, aber anstatt auf eine Antwort zu warten, fährt er mit seiner eigenen Verarbeitung fort.
- Batch-Modus. Ein Client sendet mehrere nicht blockierende Aufrufe in einer Gruppe.
- Broadcast. Ein Client sendet eine Nachricht an mehrere Server und empfängt dann alle daraus resultierenden Antworten.
- Callback. Ein Client tätigt einen nicht blockierenden Client-Server-Aufruf.
Zu den alternativen Methoden für die Client-Server-Kommunikation gehören Message Queueing, IBMs Advanced Program-to-Program Communication und Representational State Transfer (REST).
Vor- und Nachteile von RPC
RPC bietet folgende Vorteile:
- Unterstützt die Kommunikation zwischen Clients und Servern durch die traditionelle Verwendung von Prozeduraufrufen in verschiedenen Sprachen.
- Kann in lokalen und verteilten Umgebungen verwendet werden.
- Unterstützt prozessorientierte und thread-orientierte Modelle.
- Versteckt den internen Message-Passing-Mechanismus vor dem Benutzer und bietet Abstraktion.
- Lässt viele der Protokollschichten weg, um die Leistung zu verbessern.
Obwohl RPC eine Vielzahl von Vorteilen hat, sollten sich die Benutzer auch der folgenden Fallstricke bewusst sein:
- Der Client und der Server verwenden unterschiedliche Ausführungsumgebungen für ihre jeweiligen Routinen, und die Nutzung von Ressourcen ist komplexer. Daher sind RPC-Systeme nicht immer für die Übertragung großer Datenmengen geeignet.
- RPC ist störanfällig, weil es ein Kommunikationssystem, einen anderen Rechner und einen anderen Prozess einbezieht.
- RPC ist nicht so flexibel wie andere APIs, zum Beispiel REST.
RPC versus REST
REST ist ein Architekturstil für verteilte Systeme, der in der Softwareentwicklung häufig für Webdienste und Systeme verwendet wird, die problemlos miteinander kommunizieren können. Systeme, Dienstschnittstellen und APIs, die mit REST übereinstimmen, werden als RESTful APIs bezeichnet.
REST- und RPC-Protokolle weisen ähnliche Eigenschaften auf. So werden beide Protokolle beispielsweise für die Kommunikation über ein verteiltes System verwendet. Dennoch haben sie unterschiedliche Grundstrukturen und Anwendungsfälle. Während RPC es ermöglicht, Funktionen aus der Ferne aufzurufen, als ob sie lokal wären, ermöglichen REST APIs den Benutzern, Datenoperationen auf entfernten Servern durchzuführen.
REST muss zustandslos sein, während RPC-Systeme zustandsabhängig oder zustandslos sein können. REST ermöglicht auch eine größere Flexibilität, da es Daten in mehreren Formaten, wie JavaScript Object Notation (JSON) oder Extensible Markup Language (XML), in einer einzigen API senden kann, während RPC ein festes Datenformat verwendet.
RPCs werden in der Regel verwendet, um Remote-Funktionen auf einem Server aufzurufen, während REST in der Regel verwendet wird, um Standardoperationen wie das Erstellen, Lesen oder Löschen von Datensätzen auf einem Server durchzuführen.