Request–response protocols date to early distributed computing in the late 1960s, theoretical proposals of remote procedure calls as the model of network operations date to the 1970s, and practical implementations date to the early 1980s. Bruce Jay Nelson is generally credited with coining the term "remote procedure call" in 1981.1
Remote procedure calls used in modern operating systems trace their roots back to the RC 4000 multiprogramming system,2 which used a request-response communication protocol for process synchronization.3 The idea of treating network operations as remote procedure calls goes back at least to the 1970s in early ARPANET documents.4 In 1978, Per Brinch Hansen proposed Distributed Processes, a language for distributed computing based on "external requests" consisting of procedure calls between processes.5
One of the earliest practical implementations was in 1982 by Brian Randell and colleagues for their Newcastle Connection between UNIX machines.6 This was soon followed by "Lupine" by Andrew Birrell and Bruce Nelson in the Cedar environment at Xerox PARC.789 Lupine automatically generated stubs, providing type-safe bindings, and used an efficient protocol for communication.10 One of the first business uses of RPC was by Xerox under the name "Courier" in 1981. The first popular implementation of RPC on Unix was Sun's RPC (now called ONC RPC), used as the basis for Network File System (NFS).
In the 1990s, with the popularity of object-oriented programming, an alternative model of remote method invocation (RMI) was widely implemented, such as in Common Object Request Broker Architecture (CORBA, 1991) and Java remote method invocation. RMIs, in turn, fell in popularity with the rise of the internet, particularly in the 2000s.
RPC is a request–response protocol. An RPC is initiated by the client, which sends a request message to a known remote server to execute a specified procedure with supplied parameters. The remote server sends a response to the client, and the application continues its process. While the server is processing the call, the client is blocked (it waits until the server has finished processing before resuming execution), unless the client sends an asynchronous request to the server, such as an XMLHttpRequest. There are many variations and subtleties in various implementations, resulting in a variety of different (incompatible) RPC protocols.
An important difference between remote procedure calls and local calls is that remote calls can fail because of unpredictable network problems. Also, callers generally must deal with such failures without knowing whether the remote procedure was actually invoked. Idempotent procedures (those that have no additional effects if called more than once) are easily handled, but enough difficulties remain that code to call remote procedures is often confined to carefully written low-level subsystems.
To let different clients access servers, a number of standardized RPC systems have been created. Most of these use an interface description language (IDL) to let various platforms call the RPC. The IDL files can then be used to generate code to interface between the client and servers.
Notable RPC implementations and analogues include:
Bruce Jay Nelson (May 1981). Remote Procedure Call (PhD thesis). Xerox Palo Alto Research Center. PARC CSL-81-9 (Also CMU-CS-81-119). /wiki/Bruce_Jay_Nelson ↩
"Per Brinch Hansen • IEEE Computer Society". www.computer.org. Retrieved 2015-12-15. http://www.computer.org/web/awards/pioneer-per-hansen ↩
Brinch Hansen, Per (1969). RC 4000 Computer Software: Multiprogramming System (PDF). Copenhagen, Denmark: Regnecentralen. http://brinch-hansen.net/papers/1969c.pdf ↩
James E. White (December 23, 1975). "A High-Level Framework for Network-Based Resource Sharing". RFC 707. Augmentation Research Center. doi:10.17487/RFC0707. Retrieved July 11, 2011. http://tools.ietf.org/html/rfc707 ↩
Brinch Hansen, Per (November 1978). "Distributed processes: a concurrent programming concept" (PDF). Communications of the ACM. 21 (11): 934–941. CiteSeerX 10.1.1.107.3108. doi:10.1145/359642.359651. S2CID 11610744. http://brinch-hansen.net/papers/1978a.pdf ↩
Brownbridge, David R.; Marshall, Lindsay F.; Randell, Brian (1982). "The Newcastle Connection" (PDF). Software: Practice and Experience. 12 (12): 1147–1162. doi:10.1002/spe.4380121206. S2CID 1840438. Archived from the original (PDF) on 2016-08-16. Retrieved 2016-08-16. /wiki/Brian_Randell ↩
Birrell, Andrew D.; Nelson, Bruce Jay (1984). "Implementing remote procedure calls" (PDF). ACM Transactions on Computer Systems. 2: 39–59. doi:10.1145/2080.357392. S2CID 11525846. https://www.cs.cmu.edu/~dga/15-712/F07/papers/birrell842.pdf ↩
"1994 – Andrew Birrell, Bruce Nelson: Remote Procedure Call". Software System Award citation. Association for Computing Machinery. Archived from the original on April 2, 2012. Retrieved July 11, 2011. https://web.archive.org/web/20120402204704/http://awards.acm.org/citation.cfm?id=5125494&srt=all&aw=149&ao=SOFTWSYS&yr=1994 ↩
"SIGOPS Hall of Fame Award". Special Interest Group on Operating Systems. Association for Computing Machinery. Retrieved July 11, 2011. http://www.sigops.org/award-hof.html ↩
The A-Z of Programming Languages: Modula-3 - a-z of programming languages Archived 2009-01-05 at the Wayback Machine. Computerworld. Retrieved on 2013-07-17. http://www.computerworld.com.au/index.php/id;1422447371;pp;3;fp;4194304;fpid;1 ↩
tarpc, Google, 2023-11-02, retrieved 2023-11-02 https://github.com/google/tarpc ↩
libevent: Main Page. Monkey.org. Retrieved on 2013-07-17. http://www.monkey.org/~provos/libevent/doxygen-1.4.10/ ↩
"Protocol Buffers - Google's data interchange format". Google project website. Retrieved November 1, 2011. https://code.google.com/p/protobuf/ ↩
"gRPC open-source universal RPC framework". Google project website. Retrieved September 7, 2016. http://www.grpc.io/ ↩
"Google Web Toolkit". Google project website. Retrieved November 1, 2011. https://code.google.com/webtoolkit/ ↩