Definicion
Cuando llamas a una función en tu código, se ejecuta ahí mismo en tu ordenador. Pero, ¿qué pasa si la función que necesitas vive en un servidor a miles de kilómetros de distancia? Remote Procedure Call (RPC) hace esto posible - te permite llamar funciones en servidores remotos casi tan fácilmente como llamar a funciones locales. La complejidad de red desaparece, y simplemente… llamas a la función.
RPC representa una forma fundamentalmente diferente de pensar sobre APIs comparado con REST. Mientras REST se enfoca en recursos (sustantivos como “usuarios”, “pedidos”, “productos”) y operaciones estándar sobre ellos, RPC se enfoca en acciones (verbos como “crearUsuario”, “procesarPago”, “calcularEnvio”). No estás preguntando “¿cuál es el estado de este recurso?” - estás diciendo “ejecuta esta operación específica y dame el resultado”.
Este enfoque orientado a acciones frecuentemente se siente más natural para ciertos tipos de sistemas. Cuando un sistema bancario necesita transferir dinero, llamar a transferirFondos(cuentaOrigen, cuentaDestino, cantidad) es más intuitivo que construir peticiones REST a múltiples recursos. Servidores de juegos, sistemas de comunicación en tiempo real y microservicios de alto rendimiento frecuentemente prefieren RPC porque mapea directamente a cómo los desarrolladores piensan sobre el problema. Implementaciones modernas como gRPC añaden beneficios de rendimiento como protocolos binarios y soporte de streaming que HTTP/JSON simplemente no pueden igualar.
Ejemplo
Juegos online: Cuando mueves tu personaje en un juego online, tu cliente llama algo como moverJugador(playerId, nuevaPosicion) en el servidor del juego. El servidor valida el movimiento, actualiza el estado del juego, y devuelve el resultado - todo a través de RPC. Las miles de acciones por segundo en juegos multijugador dependen de RPC eficiente.
Procesamiento de pagos: Cuando tocas “Pagar” en Uber, la app llama a procesarPago(userId, rideId, amount) en los servidores de Stripe. Stripe procesa el cargo y devuelve éxito o fallo. Esto es fundamentalmente una acción siendo solicitada, no un recurso siendo obtenido.
Comunicación de microservicios: Dentro de Netflix, cuando el servicio de recomendaciones necesita el historial de visualización del usuario, podría llamar a obtenerHistorialVisualizacion(userId) en el servicio de usuarios. Estas llamadas internas ocurren millones de veces por segundo, y la eficiencia de gRPC hace esto práctico.
Funciones cloud: Cuando disparas una AWS Lambda o Google Cloud Function, esencialmente estás haciendo una llamada RPC. Invocas una función específica con parámetros específicos y recibes un resultado de vuelta.
Analogia
La Llamada Telefónica al Experto: Imagina que necesitas asesoramiento legal. Llamas a tu abogado y dices “revisa este contrato y dime los riesgos”. No te importa dónde está tu abogado o qué herramientas usa - solo quieres la respuesta. RPC funciona igual: llamas a una función remota y obtienes la respuesta sin preocuparte por los detalles de red.
La Ventana de la Cocina del Restaurante: En un restaurante, los camareros no cocinan la comida ellos mismos. Ponen una comanda en la ventana de la cocina: “prepara una carbonara, picante medio”. La cocina (servidor remoto) procesa la petición y devuelve el resultado (el plato). Esa comanda es como una llamada RPC - una petición para una acción específica.
El Mando a Distancia: Cuando presionas “Canal 5” en el mando del televisor, estás enviando un comando que se ejecuta en el televisor. No estás preguntando “¿cuál es el estado del televisor?” - estás diciendo “ejecuta esta acción específica”. RPC es el mando a distancia de la programación para servidores.
El Botón de la Máquina Expendedora: Presionas B7 en una máquina expendedora para obtener un snack específico. No negocias con la máquina sobre cómo obtenerlo - solo especificas lo que quieres y ella lo ejecuta. RPC es igualmente directo: llama a una función, obtén un resultado.
Code Example
// Ejemplo JSON-RPC
POST /api/rpc
{
"jsonrpc": "2.0",
"method": "users.create",
"params": {
"name": "Alicia",
"email": "[email protected]"
},
"id": 1
}
// Respuesta
{
"jsonrpc": "2.0",
"result": {
"id": 123,
"name": "Alicia"
},
"id": 1
}
// Ejemplo gRPC (Protocol Buffers)
service UserService {
rpc CreateUser(CreateUserRequest) returns (User);
rpc GetUser(GetUserRequest) returns (User);
}
Notas de Seguridad
- Los endpoints RPC deben validar nombres de métodos para prevenir llamadas de funciones no autorizadas, implementar autenticación por método, sanear todos los parámetros para prevenir ataques de inyección, y usar transporte cifrado (TLS)..