Skip to content

Understanding Remote Procedure Calls (RPC)

Introduction

Remote Procedure Call (RPC) is a well-established technology for distributed computing. The technology provides the solution to a fundamental problem in distributed computing, which is: how to execute a program remotely over the network on a different computer reachable over a network.

What is a Remote Procedure Call (RPC)?

Remote Procedure Call is a software communication protocol that one program can use to request a service from a program located in another computer on a network without having to understand the network’s details. RPC is used to call other processes on remote systems like a local system. A procedure call is also sometimes known as a function call or a subroutine call.

RPC uses the client-server model. The requesting program is a client, and the service-providing program is the server. Like a local procedure call, an RPC is a synchronous operation requiring the requesting program to be suspended until the results of the remote procedure are returned. However, the use of lightweight processes or threads that share the same address space enables multiple RPCs to be performed concurrently.

Key Components of RPC

The main components of RPC are:

  • Client Application: The client application is the software component that initiates a remote procedure call. It contains the code that invokes procedures on the remote server as if they were local.
  • Server Application: The server application is the software component that receives and processes remote procedure calls from clients. It provides the implementation of the procedures that clients can invoke.
  • Stubs: Stubs are generated or hand-coded pieces of code that act as intermediaries between the client and server applications. There are two types of stubs:
    • Client Stubs: These stubs reside in the client application and are responsible for marshalling (serializing) the procedure’s arguments, making the remote call, and unmarshalling (deserializing) the results.
    • Server Stubs: These stubs reside in the server application and are responsible for unmarshalling the procedure’s arguments, invoking the appropriate server-side procedure, and marshalling the results.
  • RPC Interface Definition: This is a critical component of RPC systems. It defines the procedures that can be invoked remotely, their arguments, return values, and error handling. The interface definition is typically written in a language-specific interface definition language (IDL), such as Protocol Buffers, IDL3, or CORBA IDL.
  • RPC Protocol: The RPC protocol specifies the rules and format for encoding and transmitting the remote procedure call and its parameters over the network. Different RPC frameworks and systems use various protocols, such as HTTP/HTTP2, IIOP, and custom binary or text-based formats.
  • Transport Layer: The transport layer is responsible for the actual transmission of the RPC messages over the network. It handles details such as connection management, data compression, and encryption. Common transport protocols include TCP/IP, UDP, and HTTP.
  • Name Service (Optional): In some RPC systems, a name service or directory service is used to locate the server with which the client wishes to communicate. This service resolves human-readable names or identifiers to network addresses.
  • Error Handling and Exception Mechanism: RPC systems typically include mechanisms for handling and reporting errors. This ensures that clients are informed about errors that occur during the remote procedure call and can take appropriate action.
  • Concurrency and Thread Management (Optional): In multi-threaded and multi-client environments, RPC systems may include mechanisms for managing concurrent access and ensuring thread safety.
  • Security and Authentication (Optional): Many RPC systems incorporate security features for authenticating clients and securing the communication channel through encryption and access control mechanisms.
  • Logging and Monitoring (Optional): To aid in debugging and monitoring, RPC systems often include logging facilities to capture diagnostic information about RPC calls and system performance.
  • Versioning (Optional): Some RPC frameworks support versioning of interfaces and data structures to ensure backward and forward compatibility as services and applications evolve.

How RPC Works

Remote Procedure Call (RPC) works by enabling a client to invoke a procedure or function on a remote server as if it were a local function call. Here’s how RPC works using the key components:

Client Application

  • The client initiates a remote procedure call by invoking a function or method as if it were a local call.
  • The client’s code specifies the procedure to be executed, along with its arguments, just like it would with a local function call.

RPC Interface Definition

  • Both the client and server share a common understanding of the RPC interface, including the names of procedures, the order and types of arguments, and the return values.
  • This interface is defined using an Interface Definition Language (IDL) and is agreed upon by both the client and server.

Client Stubs

  • Before making the RPC call, the client-side stub is responsible for marshalling (serializing) the procedure’s arguments into a format suitable for network transmission.
  • The client stub creates an RPC message, which includes the procedure name and the marshalled arguments.

Transport Layer

  • The client sends the RPC message, containing the procedure call and arguments, over the network to the server.
  • The transport layer handles the transmission of the message, including addressing and routing, using protocols like TCP/IP or HTTP.

Server Application

  • The server application receives the RPC message from the network.
  • Server stubs on the server side unmarshal (deserialize) the arguments from the incoming RPC message.

Server Procedures

  • The server-side stub identifies the requested procedure based on the procedure name in the RPC message.
  • The server executes the corresponding procedure with the provided arguments, just as if it were a local function call.

Result Marshalling

  • The server stub on the server side marshals (serializes) the results of the procedure into a format suitable for network transmission.

Network Transmission

  • The server-side stub sends the marshalled results back to the client over the network.

Client Stubs (Revisited)

  • The client-side stub on the client receives the results and unmarshals (deserializes) them to extract the return values.

Client Application (Continued)

  • The client’s code continues executing, now with access to the results returned by the remote procedure.
  • The client treats the results as if they were the output of a local function call, enabling it to process the results seamlessly.

Error Handling

  • Throughout this process, both the client and server may handle errors and exceptions as needed. Errors can occur during network communication or in the execution of the remote procedure.

Logging and Monitoring (Optional)

  • For debugging and monitoring purposes, RPC systems often include logging facilities to capture information about RPC calls and system performance.

Brief History of RPC

The concept of remote procedure calls dates back to the early days of distributed computing. One of the earliest implementations was in the 1970s by the Xerox Palo Alto Research Center (PARC), which used RPC as part of the Network File System (NFS) to enable remote file access. This laid the foundation for the development of RPC protocols.

In the 1980s, Sun Microsystems introduced the Network Computing System (NCS) and its associated RPC protocol, which became the basis for many subsequent RPC implementations.

Benefits of RPC

RPC offers several benefits:

  • Simplicity: Developers can write code as if they’re making a local function call, so they don’t need to worry about complex networking stuff.
  • Compatibility: RPC allows programs in different languages or running on different systems to talk to each other, fostering compatibility.
  • Scalability: Adding new services or components to a distributed system is much simpler thanks to RPC.
  • Efficiency: RPC frameworks are designed to make communication efficient, reducing network-related overhead.

Adoption of RPC in Current Technology Landscape

RPC continues to be relevant and is widely used in modern software development. Some notable instances of RPC adoption in current technology include:

  • gRPC: Developed by Google, gRPC is a high-performance RPC framework that uses Protocol Buffers for serialization. It is popular for building microservices and distributed systems.
  • RESTful Web Services: While not strictly RPC, REST (Representational State Transfer) APIs allow clients to make requests to servers in a manner similar to RPC. They have gained immense popularity in building web services.
  • JSON-RPC and XML-RPC: These lightweight RPC protocols are used for communication between applications over HTTP.
  • Blockchain and Smart Contracts: Many blockchain platforms, such as Ethereum, employ RPC to enable interactions with smart contracts running on the blockchain.

Conclusion

Remote Procedure Call (RPC) is the unsung hero behind much of the magic in distributed computing. It makes complex networking feel like a breeze, enabling seamless communication between programs across networks. As technology continues to advance, RPC remains a fundamental piece of the puzzle in building efficient and scalable distributed applications. Understanding RPC is not just about grasping a concept; it’s about unlocking the potential of interconnected systems that shape our digital world.

Nilesh Surana