Der Remote Procedure Call (dt. „Aufruf einer fernen Prozedur“) ist ein zentrales In­stru­ment, um operative und ar­beits­tei­li­ge Struk­tu­ren in Netz­wer­ken und Client-Server-Ar­chi­tek­tu­ren zu rea­li­sie­ren. Wie die Zu­sam­men­ar­beit zwischen räumlich ge­trenn­ten Rechnern via RPC-Call funk­tio­niert, auf welchen Ebenen sie statt­fin­det und wo man RPC-Konzepte heute einsetzt, wird im Folgenden erklärt.

Was ist ein Remote Procedure Call (RPC)?

Der Begriff Remote Procedure Call – deutsch: „Aufruf einer fernen Prozedur“ – be­zeich­net ein Konzept, das die In­ter­pro­zess­kom­mu­ni­ka­ti­on, also den In­for­ma­ti­ons­aus­tausch zwischen Sys­tem­pro­zes­sen, regelt. 1984 de­fi­nier­ten die In­for­ma­ti­ker Andrew Birrell und Bruce Nelson RPC als einen syn­chro­nen Me­cha­nis­mus, „der Kon­troll­fluss und Daten als Pro­ze­dur­auf­ruf zwischen zwei Adress­räu­men über ein schmal­ban­di­ges Netz trans­fe­riert“. Durch das Über­schrei­ten eines Adress­raums können Prozesse auf einem ent­fern­ten Rechner im Netzwerk gestartet und externe Instanzen operativ in Be­rech­nungs- und Da­ten­ver­ar­bei­tungs­pro­zes­se ein­be­zo­gen werden. Zum Kom­mu­ni­ka­ti­ons­pro­zess via RPC gehören die Übergabe von Pa­ra­me­tern und die Rückgabe eines Funk­ti­ons­wer­tes. Häufig bleibt es nicht bei einem Aufruf, da in der Praxis oft mehrere Anfragen parallel ab­ge­wi­ckelt werden.

Letztlich strebt das RPC-Konzept eine An­glei­chung der Ver­ar­bei­tungs­ebe­nen an: Für Pro­gram­mie­rer und Anwender sollte es im Idealfall keinen Un­ter­schied machen, um welchen Pro­ze­dur­auf­ruf es sich handelt. Aufrufe aus der Ferne sollen also prin­zi­pi­ell genauso leicht rea­li­sier­bar sein wie lokale Pro­ze­dur­auf­ru­fe (Trans­pa­renz­prin­zip). RPC-Calls stehen in Netz­wer­ken und Client-Server-Ar­chi­tek­tu­ren für eine auf­trags­ori­en­tier­te bi­di­rek­tio­na­le Kom­mu­ni­ka­ti­on. Sie ergänzen die rein nach­rich­ten­ba­sier­te Kom­mu­ni­ka­ti­on, die dem Paradigma der Ein- und Ausgabe (Ver­wen­dung von I/O-Funk­tio­nen) folgt.

Hinweis

Das Spe­zi­al­ge­biet von RPC-Calls ist die Kom­mu­ni­ka­ti­on zwischen ver­schie­de­nen Computern, sie können aber auch innerhalb eines zu­sam­men­hän­gen­den Systems zur Kom­mu­ni­ka­ti­on zwischen ver­schie­de­nen Prozessen beitragen.

Client-Stub meets Server-Stub – so funk­tio­niert RPC

RPC-Calls laufen immer nach einem be­stimm­ten Muster ab: Ein Client kon­tak­tiert z. B. bei der Suche nach einem Er­satz­teil einen zentralen Da­ten­bank­ser­ver. Der entfernt liegende Server überprüft daraufhin den Da­ten­be­stand und sendet das Ergebnis an den Client zurück. Letzterer ver­ar­bei­tet die er­hal­te­nen Daten und zeigt z. B. eine Liste mit den Be­stands­da­ten in einer Ver­wal­tungs­soft­ware an.

An der Im­ple­men­tie­rung eines Remote Procedure Calls sind auf Sender- und Emp­fän­ger­sei­te spezielle Instanzen beteiligt, die als Stubs (dt. „Stummel“) be­zeich­net werden. Der Client-Stub agiert auf der Client-Seite als Stell­ver­tre­ter der ent­fern­ten Server-Prozedur. Der Server-Stub ist der ser­ver­sei­ti­ge Stell­ver­tre­ter des auf­ru­fen­den Client-Codes. Die Stubs si­mu­lie­ren operativ eine funk­tio­na­le lokale Einheit, indem sie das „Ent­fernt­sein“ des Codes auf der jeweils anderen Seite ka­schie­ren. Zugleich fungieren sie als Prozedur-Schnitt­stel­len. Der typische Ablauf eines RPC-Calls zeichnet sich durch folgende Schritte aus:

  1. Der Client-Code ruft eine Stub-Prozedur auf (lokaler Client-Stub).
  2. Der Client-Stub generiert aus den über­ge­be­nen Pa­ra­me­tern des Pro­ze­dur­auf­rufs eine sen­de­fä­hi­ge Nachricht, die sich an das RPC-Protokoll hält. Bei dem Transfer findet eine Se­ria­li­sie­rung statt, bei der struk­tu­rier­te Daten in eine se­quen­zi­el­le Dar­stel­lungs­form überführt werden. Dieser Über­set­zungs­vor­gang wird auch als Mar­shalling (von engl. „to marshal“, dt. „auf­stel­len“, „ordnen“) be­zeich­net.
  3. Der Client-Stub kon­tak­tiert danach das Kom­mu­ni­ka­ti­ons­sys­tem des lokalen Computers, das für den an­schlie­ßen­den Nach­rich­ten­aus­tausch zwischen Client und Server häufig wahlweise TCP/IP oder UDP/IP nutzt.
  4. Nach Ankunft der ge­sen­de­ten Nachricht beim Empfänger vollzieht der Server-Stub das so­ge­nann­te De- bzw. Un­mar­shalling, indem er die in der Nachricht ent­hal­te­nen Parameter wieder entpackt (auf Basis des RPC-Pro­to­kolls).
  5. Der Server-Stub übergibt die de­ko­dier­ten Parameter und sorgt damit für den lokalen Aufruf einer Server-Prozedur.
  6. Der daraus re­sul­tie­ren­de Funk­ti­ons­wert wird an den Server-Stub kom­mu­ni­ziert.
  7. Nun vollzieht sich der Ablauf in um­ge­kehr­ter Richtung: Ge­ne­rie­rung einer sen­de­fä­hi­gen Nachricht gemäß RPC-Protokoll, Nach­rich­ten­aus­tausch zwischen Server und Client, dann wird der Rück­ga­be­wert zum wartenden Client-Code trans­por­tiert. Die Anwendung auf dem Ur­sprungs­rech­ner wird fortsetzt.

Cloud Computing und Com­pu­ter­clus­ter – Ein­satz­ge­bie­te von RPC-Calls

RPC-Calls werden heute in vielen Bereichen ein­ge­setzt. Sie dienen als Baustein von Web­ser­vices (z. B. in Form des Pro­to­kolls XML-RPC für entfernte Funk­ti­ons­auf­ru­fe via HTTP) und er­mög­li­chen verteilte An­wen­dun­gen (Dis­tri­bu­ted Ap­pli­ca­ti­ons), bei denen sich ver­schie­de­ne Re­chen­ma­schi­nen vor­han­de­ne Res­sour­cen und an­fal­len­de Aufgaben teilen. Unter anderem zählen hierzu Cloud-Computing-Dienste, Bank- und Bu­chungs­sys­te­me in der Rei­se­bran­che sowie Da­ten­ban­ken. Weitere Ein­satz­ge­bie­te sind Computer-Cluster (High-Avai­la­bi­li­ty-Cluster), de­zen­tra­le Peer-to-Peer-Netzwerke sowie Block­chains (bei­spiels­wei­se von Kryp­to­wäh­run­gen), die häufig ebenfalls mit der RPC-Technik arbeiten.

Remote Procedure Calls sind zudem es­sen­ti­ell für heutige Be­triebs­sys­te­me. Windows erledigt mit ihrer Hilfe zum Beispiel viele Routinen, die permanent anfallen. So nutzen etwa der Faxdienst, die Dru­cker­war­te­schlan­ge oder ein­ge­rich­te­te Netz­werk­ver­bin­dun­gen einen Sys­tem­dienst, der in deutsch­spra­chi­gen Sys­tem­ver­sio­nen als „Re­mo­te­pro­ze­dur­auf­ruf“ be­zeich­net wird.

In der Unix- und Linux-Welt spielt das von Sun Mi­cro­sys­tems ent­wi­ckel­te Network File System (NFS) eine wichtige Rolle. Es verwendet RPC-Calls zwischen Clients und Servern, um etwa das Da­tei­sys­tem eines ent­fern­ten Rechners teilweise oder komplett auf einem lokalen Computer zu mounten, also verfügbar zu machen. Durch das Verfahren kann der User mit einzelnen Dateien eines Remote-Computers so umgehen, als ob sie sich auf seinem eigenen Rechner befinden. De­fi­nier­te Da­tei­be­rech­ti­gun­gen regeln dann die Lese- und Schreib­rech­te. Auch das Network In­for­ma­ti­on System (NIS) nutzt RPC und verwaltet damit zentral UNIX- und Linux-Systeme.

Was sind die Vorteile von RPC?

Das RPC-Protokoll wickelt die In­ter­pro­zess­kom­mu­ni­ka­ti­on zu­ver­läs­sig ab und benötigt dabei relativ geringe Ver­ar­bei­tungs­zei­ten. Die Pro­gram­mie­rung von Kom­mu­ni­ka­ti­ons­pro­zes­sen räumlich ent­fern­ter Computer wird erheblich er­leich­tert, da z. B. keine Rücksicht auf komplexe Details des jeweils ver­wen­de­ten Netzwerks genommen werden muss. Zudem erlaubt das RPC-Konzept eine kon­se­quen­te Mo­du­la­ri­sie­rung. Prozesse lassen sich auslagern, einzelne Computer werden dadurch entlastet. Netzwerke und verteilte Systeme können durch Ar­beits­tei­lung ef­fi­zi­en­ter arbeiten, indem für besondere Aufgaben spe­zia­li­sier­te Platt­for­men ein­ge­setzt werden (z. B. Da­ten­bank­ser­ver). Dabei können die be­tei­lig­ten Prot­ago­nis­ten weltweit vernetzt sein. Weitere Vorzüge sind die her­vor­ra­gen­de Ska­lier­bar­keit der rea­li­sier­ten Client-Server-Ar­chi­tek­tu­ren sowie die Mög­lich­keit, un­kom­pli­ziert cloud­ba­siert arbeiten zu können.

Was sind die Nachteile von RPC?

Zu den Nach­tei­len der RPC-Technik zählt der Umstand, dass es keinen ein­heit­li­chen Standard für RPC-Calls gibt. Die un­ter­schied­li­chen – meist fir­men­spe­zi­fi­schen – Um­set­zun­gen (z. B. ONC-RPC von Sun) sind un­ter­ein­an­der nor­ma­ler­wei­se nicht kom­pa­ti­bel. Zudem bringen die Transfer- und Über­mitt­lungs­ebe­nen RPC-basierter Systeme gewisse Ge­schwin­dig­keits­ein­bu­ßen mit sich, was bei rein lokalen Pro­ze­dur­auf­ru­fen nicht der Fall ist. Da Client und Server für ihre je­wei­li­gen Routinen un­ter­schied­li­che Aus­füh­rungs­um­ge­bun­gen nutzen, wird auch die Ver­wen­dung von Res­sour­cen (z. B. Dateien) auf­wen­di­ger. RPC-Systeme sind daher für die Übergabe großer Da­ten­men­gen nicht so gut geeignet.

Durch die Auf­tei­lung auf ver­schie­de­ne Ver­ar­bei­tungs­in­stan­zen wird die Feh­ler­an­fäl­lig­keit erhöht. Nach­rich­ten können in der Kom­mu­ni­ka­ti­on ver­lo­ren­ge­hen (Netz­werk­feh­ler, Ausfall eines Knotens im Netzwerk), es kann zu Ver­zö­ge­run­gen und Abbrüchen kommen. Timing-Probleme, red­un­dan­te Dop­pel­aus­füh­run­gen (z. B. von Pro­zess­auf­ru­fen) oder un­er­wünsch­te Asyn­chro­ni­tä­ten in der Ma­schi­nen­kom­mu­ni­ka­ti­on zählen zu den daraus re­sul­tie­ren­den Kom­pli­ka­tio­nen. Beim syn­chro­nen RPC kann ein Ser­ver­pro­blem (z. B. Crash) den Client be­ein­träch­ti­gen, wenn der auf­ru­fen­de Prozess ver­geb­lich auf den Rück­ga­be­wert wartet. An­de­rer­seits wird der Server aus­ge­bremst, wenn die Antwort des Clients zeit­ver­zö­gert bzw. gar nicht bei ihm ankommt. Diese Feh­ler­an­fäl­lig­keit kann sich gerade in um­fang­rei­chen und hoch­gra­dig ar­beits­tei­li­gen Ar­chi­tek­tu­ren weit­rei­chend auswirken.

Aufgrund möglicher Feh­ler­quel­len muss außerdem eine spezielle RPC-Feh­ler­se­man­tik be­rück­sich­tigt werden, was die Pro­gram­mie­rung ver­hält­nis­mä­ßig aufwendig macht. Pro­gram­mie­rer und Sys­tem­ent­wick­ler müssen sich mit den Si­cher­heits­aspek­ten aus­ein­an­der­set­zen, die verteilte Systeme und ihre Kom­mu­ni­ka­ti­on via RPC und UDP/IP bzw. TCP/IP mit sich bringen (Netz­werk­si­cher­heit, Hacking, Denial-of-Service-Angriffe usw.).

Hinweis

Einige Probleme, die aus einer ge­ne­rel­len Syn­chro­ni­tät von Client und Server re­sul­tie­ren, können mit asyn­chro­nen RPC-Konzepten gelöst werden. Bei dem Verfahren muss der Client nicht zwingend auf eine Antwort vom Server warten. Er darf den Pro­gramm­fluss fort­set­zen und nach einem Call noch andere Ope­ra­tio­nen ausführen. Die Rück­mel­dung des Servers wird dann zu einem späteren Zeitpunkt vom Client ver­ar­bei­tet. Die spezielle Pro­gram­mie­rung asyn­chro­ner RPC-Calls ist al­ler­dings sehr komplex und aufwendig.

Zum Hauptmenü