Articulo de referencia

Llamada a procedimiento remoto

En la computación distribuida, una llamada a procedimiento remoto ( RPC ) es una acción en la que un programa informático hace que un procedimiento (subrutina) se ejecute en un ...

En la computación distribuida, una llamada a procedimiento remoto ( RPC ) es una acción en la que un programa informático hace que un procedimiento (subrutina) se ejecute en un espacio de direcciones diferente al del proceso actual (generalmente en otro ordenador de una red compartida). Esta llamada se escribe como si fuera una llamada a procedimiento normal (local), sin que el programador especifique explícitamente los detalles de la interacción remota. Es decir, el programador escribe prácticamente el mismo código, tanto si la subrutina es local como remota. Esta es una forma de interacción servidor-servidor (el emisor es el cliente y el ejecutor es el servidor), que normalmente se implementa mediante 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 remota de métodos (RMI). El modelo RPC implica un cierto grado de transparencia de ubicación, es decir, que los procedimientos que realizan la llamada son prácticamente iguales, tanto si son locales como remotos, aunque no suelen ser idénticos, por lo que las llamadas locales se pueden distinguir de las remotas. Las llamadas remotas suelen ser mucho más lentas y menos fiables que las locales, por lo que distinguirlas es importante.

Las RPC son una forma de comunicación entre procesos (IPC) , en la que los distintos procesos tienen espacios de direcciones diferentes: 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 hosts diferentes, el espacio de direcciones físicas también es diferente. Se han utilizado muchas tecnologías diferentes (a menudo incompatibles) para implementar el concepto. Los marcos de RPC modernos, como gRPC y Apache Thrift , mejoran el modelo RPC básico mediante el uso de serialización binaria eficiente (por ejemplo, Protocol Buffers), multiplexación HTTP/2 y soporte integrado para características como autenticación, equilibrio de carga, transmisión y manejo de errores, lo que los hace idóneos para construir microservicios escalables y habilitar la interoperabilidad de lenguajes. [ 1 ]

Historia y orígenes

Los protocolos de solicitud-respuesta se remontan a los inicios de la computación distribuida a finales 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 atribuye a Bruce Jay Nelson la creación del término "llamada a procedimiento remoto" en 1981. [ 2 ]

Las llamadas a procedimientos remotos utilizadas en los sistemas operativos modernos tienen sus raíces en el sistema de multiprogramación RC 4000, [ 3 ] que utilizaba un protocolo de comunicación de solicitud-respuesta para la sincronización de procesos. [ 4 ] 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. [ 5 ] En 1978, Per Brinch Hansen propuso Distributed Processes, un lenguaje para la computación distribuida basado en "solicitudes externas" que consisten en llamadas a procedimientos entre procesos. [ 6 ]

Una de las primeras implementaciones prácticas fue en 1982 por Brian Randell y colegas para su Newcastle Connection entre máquinas UNIX. [ 7 ] A esto le siguió pronto "Lupine" por Andrew Birrell y Bruce Nelson en el entorno Cedar en Xerox PARC. [ 8 ] [ 9 ] [ 10 ] Lupine generaba automáticamente stubs, proporcionando enlaces con seguridad de tipos, y utilizaba un protocolo eficiente para la comunicación. [ 9 ] Uno de los primeros usos comerciales de RPC fue por Xerox bajo el nombre "Courier" en 1981. La primera implementación popular de RPC en Unix fue 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 la arquitectura CORBA (Common Object Request Broker Architecture, 1991) y la invocación remota de métodos de Java. Posteriormente, la popularidad de las RMI disminuyó 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 llamada RPC enviando 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 ejecución. Mientras el servidor procesa la llamada, el cliente se bloquea (espera hasta que el servidor finalice el procesamiento antes de reanudar la ejecución), a menos que envíe una solicitud asíncrona al servidor, como una XMLHttpRequest . Existen numerosas variaciones y sutilezas en las distintas implementaciones, lo que da lugar a una variedad de protocolos RPC diferentes (e 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, quienes realizan las llamadas generalmente deben lidiar con estos fallos sin saber si el procedimiento remoto se ejecutó correctamente. Los procedimientos idempotentes (aquellos que no tienen efectos adicionales si se llaman más de una vez) son fáciles de manejar, pero aún existen suficientes dificultades como para que el código para llamar a procedimientos remotos a menudo se limite a subsistemas de bajo nivel cuidadosamente diseñados .

Secuencia de eventos

  1. El cliente llama al stub del cliente. La llamada es una llamada a procedimiento local, con los parámetros insertados en la pila de la forma habitual.
  2. El cliente stub empaqueta los parámetros en un mensaje y realiza una llamada al sistema para enviar el mensaje. Empaquetar los parámetros se denomina serialización .
  3. El sistema operativo local del cliente envía el mensaje desde la máquina cliente a la máquina servidora.
  4. El sistema operativo local de la máquina servidora pasa los paquetes entrantes al stub del servidor.
  5. El stub del servidor extrae los parámetros del mensaje. Este proceso de extracción de parámetros se denomina deserialización.
  6. Finalmente, el stub del servidor llama al procedimiento del servidor. La respuesta reproduce los mismos pasos en sentido inverso.

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 ellos utilizan un lenguaje de descripción de interfaz (IDL) para que diversas plataformas puedan realizar llamadas RPC. Los archivos IDL se pueden usar para generar código que permita la comunicación entre el cliente y los servidores.

Análogos

Entre las implementaciones y análogos de RPC más destacados se incluyen:

Específico del idioma

  • La API de invocación de métodos remotos de Java (Java RMI) proporciona una funcionalidad similar a la de los métodos RPC estándar de Unix.
  • Go proporciona el paquete rpc para implementar RPC, con soporte para llamadas asíncronas.
  • Los objetos de red de Modula-3, que fueron la base de RMI de Java [ 11 ]
  • RPyC implementa mecanismos RPC en Python, con soporte para llamadas asíncronas.
  • Distributed Ruby (DRb) permite que los programas Ruby se comuniquen entre sí en la misma máquina o a través de una red. DRb utiliza la invocación remota de métodos (RMI) para pasar comandos y datos entre procesos.
  • Erlang está orientado a procesos y admite de forma nativa la distribución y las llamadas a procedimientos remotos (RPC) mediante el paso de mensajes entre nodos y procesos locales.
  • Elixir se basa en Erlang. Permite la comunicación entre procesos (procesos de Elixir/Erlang, no procesos del sistema operativo) en la misma red de forma predeterminada mediante agentes y paso de mensajes.
  • El framework RPC de Rust de Google, Tarpc, permite a los desarrolladores definir la estructura de los mensajes utilizando las estructuras y los rasgos de Rust, en lugar de utilizar protobuf. [ 12 ]

Específico de la aplicación

  • El formato de mensaje de acción (AMF) permite que las aplicaciones de Adobe Flex se comuniquen con sistemas back-end u otras aplicaciones que admitan AMF.
  • La llamada a función remota (RFC) es la interfaz estándar de SAP para la comunicación entre sistemas SAP. Mediante RFC, se invoca una función que debe ejecutarse en un sistema remoto.

General

  • NFS (Network File System) es uno de los usuarios más destacados de RPC.
  • RPC (Computación en Red Abierta), de Sun Microsystems (también conocido como Sun RPC)
  • El programa IPC de código abierto D-Bus proporciona una funcionalidad similar a la de CORBA.
  • SORCER proporciona la API y el lenguaje orientado a la ejecución (EOL) para la invocación de un método federado.
  • XML-RPC es un protocolo RPC que utiliza 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 inspirado en JSON-RPC.
  • SOAP es el sucesor de XML-RPC y también utiliza XML para codificar sus llamadas basadas en HTTP.
  • Plataforma de computación distribuida Ice ( Internet Communications Engine ) de ZeroC .
  • Marco de trabajo Etch para la creación de servicios de red.
  • Protocolo y marco de trabajo Apache Thrift .
  • CORBA proporciona la invocación remota de procedimientos a través de una capa intermedia denominada agente de solicitud de objetos .
  • Libevent proporciona un marco para crear servidores y clientes RPC. [ 13 ]
  • 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 funcionalidades RPC para sistemas distribuidos implementados en la plataforma Windows. Ha sido reemplazado por WCF .
  • El protocolo DCOM de Microsoft utiliza MSRPC, que se basa en DCE/RPC.
  • El entorno de computación distribuida DCE/RPC de la 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 [ 14 ] de código abierto en 2015 como gRPC. [ 1 ]
  • WAMP combina RPC y el protocolo de publicación-suscripción en un único protocolo independiente del protocolo de transporte.
  • Google Web Toolkit utiliza una RPC asíncrona para comunicarse con el servicio del servidor. [ 15 ]
  • Apache Avro proporciona RPC, donde el cliente y el servidor intercambian esquemas en el protocolo de enlace de la conexión y no se requiere la generación de código.

Véase también

Referencias

  1. 1 2 "gRPC marco de trabajo RPC universal de código abierto" . Sitio web del proyecto de Google . Consultado el 7 de septiembre de 2016 .
  2. Bruce Jay Nelson (mayo de 1981). Llamada a procedimiento remoto (tesis doctoral). Centro de Investigación Xerox Palo Alto. PARC CSL-81-9 (también CMU-CS-81-119).
  3. ^ "Por Brinch Hansen • IEEE Computer Society" . www.computer.org . Consultado el 15 de diciembre de 2015 .
  4. ^ Brinch Hansen, Per (1969). Software informático RC 4000: Sistema de multiprogramación (PDF) . Copenhague, Dinamarca: Regnecentralen.
  5. James E. White (23 de diciembre de 1975). "Un marco de alto nivel para el intercambio de recursos basado en redes" . RFC 707. Centro de Investigación de Aumento . doi : 10.17487/RFC0707 . Consultado el 11 de julio de 2011 .
  6. Brinch Hansen, Per (noviembre de 1978). "Procesos distribuidos: un concepto de programación concurrente" (PDF) . Communications of the ACM . 21 (11): 934– 941. CiteSeerX 10.1.1.107.3108 . doi : 10.1145/359642.359651 . S2CID 11610744 .  
  7. 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. Archivado del original (PDF) el 16 de agosto de 2016. Recuperado el 16 de agosto de 2016 . 
  8. Birrell, Andrew D.; Nelson, Bruce Jay (1984). "Implementación de llamadas a procedimientos remotos" (PDF) . ACM Transactions on Computer Systems . 2 : 39–59 . doi : 10.1145/2080.357392 . S2CID 11525846 . 
  9. 1 2 "1994 – Andrew Birrell, Bruce Nelson: Llamada a procedimiento remoto" . Mención del premio al sistema de software . Asociación para la Maquinaria de Computación . Archivado del original el 2 de abril de 2012. Recuperado el 11 de julio de 2011 .
  10. "Premio Salón de la Fama de SIGOPS" . Grupo de Interés Especial en Sistemas Operativos . Asociación para la Maquinaria de Computación . Consultado el 11 de julio de 2011 .
  11. 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 Wayback Machine . Computerworld. Recuperado el 17 de julio de 2013.
  12. tarpc , Google, 2 de noviembre de 2023 , consultado el 2 de noviembre de 2023
  13. libevent: Página principal . Monkey.org. Consultado el 17 de julio de 2013.
  14. "Protocol Buffers: formato de intercambio de datos de Google" . Sitio web del proyecto de Google . Consultado el 1 de noviembre de 2011 .
  15. "Google Web Toolkit" . Sitio web del proyecto de Google . Consultado el 1 de noviembre de 2011 .
  • RFC 9289 – Hacia el cifrado de llamadas a procedimientos remotos por defecto 
  • RFC 5531 - Especifica la versión 2 de ONC RPC (tercera versión 2 de RFC publicada) 
  • RFC 1831 - Especifica la versión 2 de ONC RPC (segunda versión 2 de RFC publicada) 
  • RFC 1057 - Especifica la versión 2 de ONC RPC (primera versión 2 de RFC publicada) 
  • RFC 1050 - Especifica la primera versión de ONC RPC (primera versión RFC publicada) 
  • Llamadas a procedimientos remotos (RPC) : un tutorial sobre RPC de la ONC a cargo del Dr. Dave Marshall de la Universidad de Cardiff.
  • Introducción a la programación RPC : una introducción a RPC y XDR para desarrolladores, basada en la documentación de SGI IRIX.