En la computación distribuida , una llamada a procedimiento remoto ( RPC ) es cuando un programa de computadora hace que un procedimiento ( subrutina ) se ejecute en un espacio de direcciones diferente (comúnmente en otra computadora en una red compartida), que se codifica como si fuera una normal ( local) al procedimiento, sin que el programador codifique explícitamente los detalles para la interacción remota. Es decir, el programador escribe esencialmente el mismo código ya sea que la subrutina sea local al programa en ejecución o remota. Esta es una forma de interacción cliente-servidor (la persona que llama es el cliente, el ejecutor es el servidor), generalmente implementada a través de un sistema de paso de mensajes de solicitud-respuesta. En el paradigma de programación orientada a objetos, las RPC se representan mediante la invocación de métodos remotos(RMI). El modelo RPC implica un nivel de transparencia de ubicación , es decir, que los procedimientos de llamada son en gran medida los mismos ya sean locales o remotos, pero generalmente no son idénticos, por lo que las llamadas locales se pueden distinguir de las llamadas remotas. Las llamadas remotas suelen ser órdenes de magnitud más lentas y menos confiables que las llamadas locales, por lo que es importante distinguirlas.
Las RPC son una forma de comunicación entre procesos (IPC), en el sentido de que diferentes procesos tienen diferentes espacios de direcciones: si están en la misma máquina host, tienen espacios de direcciones virtuales distintos, aunque el espacio de direcciones físicas sea el mismo; mientras que si están en diferentes hosts, el espacio de direcciones físicas es diferente. Se han utilizado muchas tecnologías diferentes (a menudo incompatibles) para implementar el concepto.
Historia y orígenes
Los protocolos de solicitud-respuesta datan de la computación distribuida temprana a fines de la década de 1960, las propuestas teóricas de llamadas a procedimientos remotos como modelo de operaciones de red datan de la década de 1970 y las implementaciones prácticas datan de principios de la década de 1980. Generalmente se le atribuye a Bruce Jay Nelson el haber acuñado el término "llamada de procedimiento remoto" en 1981. [1]
Las llamadas a procedimientos remotos utilizadas en los sistemas operativos modernos tienen sus raíces en el sistema de multiprogramación RC 4000 , [2] que usaba un protocolo de comunicación de solicitud-respuesta para la sincronización de procesos. [3] La idea de tratar las operaciones de red como llamadas a procedimientos remotos se remonta al menos a la década de 1970 en los primeros documentos de ARPANET . [4] En 1978, Per Brinch Hansen propuso Distributed Processes, un lenguaje para computación distribuida basado en "solicitudes externas" que consiste en llamadas a procedimientos entre procesos. [5]
Una de las primeras implementaciones prácticas fue en 1982 por Brian Randell y sus colegas para su Conexión de Newcastle entre máquinas UNIX. [6] Esto fue seguido pronto por "Lupin" de Andrew Birrell y Bruce Nelson en el ambiente Cedar en Xerox PARC . [7] [8] [9] Lupin generó automáticamente stubs, proporcionando enlaces de tipo seguro y usó un protocolo eficiente para la comunicación. [8] Uno de los primeros usos comerciales de RPC fue realizado por Xerox con el nombre "Courier" en 1981. La primera implementación popular de RPC en Unix fue el RPC de Sun (ahora llamado ONC RPC), utilizado como base para Network File System ( NFS).
En la década de 1990, con la popularidad de la programación orientada a objetos , se implementó ampliamente un modelo alternativo de invocación remota de métodos (RMI), como en Common Object Request Broker Architecture (CORBA, 1991) y la invocación remota de métodos Java . Las RMI, a su vez, perdieron popularidad con el auge de Internet, especialmente en la década de 2000.
Paso de mensajes
RPC es un protocolo de solicitud-respuesta . El cliente inicia una RPC , que envía un mensaje de solicitud a un servidor remoto conocido para ejecutar un procedimiento específico con los parámetros proporcionados. El servidor remoto envía una respuesta al cliente y la aplicación continúa su proceso. Mientras el servidor procesa la llamada, el cliente está bloqueado (espera hasta que el servidor haya terminado de procesar antes de reanudar la ejecución), a menos que el cliente envíe una solicitud asincrónica al servidor, como XMLHttpRequest . Hay muchas variaciones y sutilezas en varias implementaciones, lo que da como resultado una variedad de protocolos RPC diferentes (incompatibles).
Una diferencia importante entre las llamadas a procedimientos remotos y las llamadas locales es que las llamadas remotas pueden fallar debido a problemas de red impredecibles. Además, las personas que llaman generalmente deben lidiar con tales fallas sin saber si realmente se invocó el procedimiento remoto. Los procedimientos idempotentes (aquellos que no tienen efectos adicionales si se llaman más de una vez) se manejan fácilmente, pero siguen existiendo suficientes dificultades para que el código para llamar a procedimientos remotos a menudo se limite a subsistemas de bajo nivel cuidadosamente escritos.
Secuencia de eventos
- El cliente llama al talón del cliente . La llamada es una llamada a un procedimiento local, con parámetros insertados en la pila de la forma normal.
- El código auxiliar del cliente empaqueta los parámetros en un mensaje y realiza una llamada al sistema para enviar el mensaje. El empaquetado de los parámetros se denomina clasificación .
- El sistema operativo local del cliente envía el mensaje desde la máquina cliente a la máquina servidor.
- El sistema operativo local en la máquina del servidor pasa los paquetes entrantes al stub del servidor .
- El stub del servidor descomprime los parámetros del mensaje. Desempaquetar los parámetros se llama desagrupar .
- Finalmente, el stub del servidor llama al procedimiento del servidor. La respuesta sigue los mismos pasos en dirección contraria.
Mecanismos de contacto estándar
Para permitir que diferentes clientes accedan a los servidores, se han creado varios sistemas RPC estandarizados. La mayoría de estos utilizan un lenguaje de descripción de interfaz (IDL) para permitir que varias plataformas llamen al RPC. Los archivos IDL se pueden utilizar para generar código para la interfaz entre el cliente y los servidores.
Análogos
Las implementaciones y análogos de RPC notables incluyen:
Específico del idioma
- Java 's Java Remote Method Invocation API (Java RMI) proporciona una funcionalidad similar a métodos estándar Unix RPC.
- Go proporciona el paquete rpc para implementar RPC, con soporte para llamadas asincrónicas.
- Objetos de red de Modula-3 , que fueron la base del RMI de Java [10]
- RPyC implementa mecanismos RPC en Python, con soporte para llamadas asincrónicas.
- Distributed Ruby (DRb) permite que los programas de Ruby se comuniquen entre sí en la misma máquina o en una red. DRb utiliza la invocación de método remoto (RMI) para pasar comandos y datos entre procesos.
- Erlang está orientado a procesos y admite de forma nativa la distribución y los RPC a través del paso de mensajes entre nodos y procesos locales por igual.
- Elixir se basa en la máquina virtual Erlang y permite la comunicación de procesos (procesos Elixir / Erlang, no procesos del sistema operativo) de la misma red lista para usar a través de agentes y paso de mensajes.
Específico de la aplicación
- El formato de mensaje de acción (AMF) permite que las aplicaciones de Adobe Flex se comuniquen con back-end u otras aplicaciones que admitan AMF.
- Remote Function Call es la interfaz estándar de SAP para la comunicación entre sistemas SAP. RFC llama a una función para que se ejecute en un sistema remoto.
General
- NFS ( Network File System ) es uno de los usuarios más destacados de RPC
- Llamada a procedimiento remoto de computación en red abierta , de Sun Microsystems
- El programa IPC de código abierto D-Bus proporciona una función similar a CORBA .
- SORCER proporciona la API y el lenguaje orientado al esfuerzo (EOL) para la invocación de un método federado
- XML-RPC es un protocolo RPC que usa XML para codificar sus llamadas y HTTP como mecanismo de transporte.
- JSON-RPC es un protocolo RPC que utiliza mensajes codificados en JSON
- JSON-WSP es un protocolo RPC que utiliza mensajes codificados en JSON
- SOAP es un sucesor de XML-RPC y también usa XML para codificar sus llamadas basadas en HTTP.
- ZeroC 's de comunicaciones por Internet del motor (ICE) de plataforma de computación distribuida.
- Etch framework para la construcción de servicios de red.
- Protocolo y marco Apache Thrift .
- CORBA proporciona la invocación de procedimientos remotos a través de una capa intermedia denominada agente de solicitud de objetos .
- Libevent proporciona un marco para la creación de clientes y servidores RPC. [11]
- Windows Communication Foundation es una interfaz de programación de aplicaciones en el marco .NET para crear aplicaciones conectadas y orientadas a servicios.
- Microsoft .NET Remoting ofrece funciones de RPC para sistemas distribuidos implementados en la plataforma Windows. Ha sido reemplazado por WCF .
- Microsoft DCOM usa MSRPC que se basa en DCE / RPC
- El entorno informático distribuido DCE / RPC de Open Software Foundation (también implementado por Microsoft).
- El paquete Google Protocol Buffers (protobufs) incluye un lenguaje de definición de interfaz utilizado para sus protocolos RPC [12] de código abierto en 2015 como gRPC . [13]
- WAMP combina RPC y Publish-Subscribe en un único protocolo independiente del transporte.
- Google Web Toolkit utiliza un RPC asincrónico para comunicarse con el servicio del servidor. [14]
- Apache Avro proporciona RPC donde no se requieren esquemas de intercambio de cliente y servidor en el protocolo de enlace de conexión y la generación de código.
- El RPC integrado es una implementación de RPC liviana desarrollada por NXP, dirigida a núcleos de CortexM primarios
- KF Trusted Execution Environment utiliza proxy y ordenación de objetos para comunicar objetos a través de entornos sandbox
- msgpack-rpc es una implementación de RPC liviana que usa MessagePack para serializar datos. Se utiliza en el editor de texto Neovim .
Ver también
- 9P
- Microsoft RPC
- Llamada a procedimiento local
- HTTP
- ODBC
- Evaluación remota
- Representación de datos externos (formato de serialización utilizado, por ejemplo, por NFS)
- Representación de datos de red (formato de serialización utilizado por, por ejemplo, Microsoft RPC)
- Arquitectura orientada a recursos
- Middleware de objetos distribuidos
- Objeto fragmentado
- gRPC
Referencias
- ^ Bruce Jay Nelson (mayo de 1981). Llamada a procedimiento remoto . PARC CSL-81-9 (también CMU-CS-81-119) . Centro de investigación Xerox Palo Alto. Tesis doctoral.
- ^ "Per Brinch Hansen • IEEE Computer Society" . www.computer.org . Consultado el 15 de diciembre de 2015 .
- ^ Brinch Hansen, Per (1969). Software informático RC 4000: Sistema de multiprogramación (PDF) . Copenhague, Dinamarca: Regnecentralen.
- ^ James E. White (23 de diciembre de 1975). "Un marco de alto nivel para el intercambio de recursos basados en la red" . RFC 707 . Centro de Investigación de Aumento . Consultado el 11 de julio de 2011 .
- ^ Brinch Hansen, Per (noviembre de 1978). "Procesos distribuidos: un concepto de programación concurrente" (PDF) . Comunicaciones de la ACM . 21 (11): 934–941. CiteSeerX 10.1.1.107.3108 . doi : 10.1145 / 359642.359651 .
- ^ Brownbridge, David R .; Marshall, Lindsay F .; Randell, Brian (1982). "La conexión de Newcastle" (PDF) . Software: práctica y experiencia . 12 (12): 1147-1162. doi : 10.1002 / spe.4380121206 . Archivado desde el original (PDF) el 16 de agosto de 2016 . Consultado el 16 de agosto de 2016 .
- ^ Birrell, Andrew D .; Nelson, Bruce Jay (1984). "Implementación de llamadas a procedimientos remotos" (PDF) . Transacciones ACM en sistemas informáticos . 2 : 39–59. doi : 10.1145 / 2080.357392 .
- ^ a b "1994 - Andrew Birrell, Bruce Nelson: llamada a procedimiento remoto" . Cita del premio al sistema de software . Asociación de Maquinaria Informática . Archivado desde el original el 2 de abril de 2012 . Consultado el 11 de julio de 2011 .
- ^ "Premio Salón de la Fama SIGOPS" . Grupo de Interés Especial en Sistemas Operativos . Asociación de Maquinaria Informática . Consultado el 11 de julio de 2011 .
- ^ El AZ de los lenguajes de programación: Modula-3 - az de los lenguajes de programación Archivado el 5 de enero de 2009 en la Wayback Machine . Mundo de la informática. Consultado el 17 de julio de 2013.
- ^ libevent: página principal . Monkey.org. Consultado el 17 de julio de 2013.
- ^ "Protocol Buffers - formato de intercambio de datos de Google" . Sitio web del proyecto de Google . Consultado el 1 de noviembre de 2011 .
- ^ "Marco RPC universal de código abierto gRPC" . Sitio web del proyecto de Google . Consultado el 7 de septiembre de 2016 .
- ^ "Kit de herramientas web de Google" . Sitio web del proyecto de Google . Consultado el 1 de noviembre de 2011 .
enlaces externos
- RFC 1057: especifica la versión 1 de ONC RPC
- RFC 5531: especifica la versión 2 de ONC RPC
- Llamadas a procedimiento remoto (RPC) : un tutorial sobre ONC RPC por el Dr. Dave Marshall de la Universidad de Cardiff
- Introducción a la programación de RPC : una introducción del desarrollador a RPC y XDR, de la documentación de SGI IRIX.