¿Qué tipo de problema existiría si la Llamada a procedimiento remoto (RPC) se realiza mediante llamada por valor y llamada por referencia?

Ambos pueden hacerse trabajar; la llamada por referencia es simplemente más complicada.

El “problema” con la llamada por valor es que cada pieza de información en los argumentos de la llamada debe empaquetarse y enviarse al lado remoto, incluso si la computadora remota nunca la usa. Supongamos que uno de los argumentos es una gran matriz; entonces el costo de hacer la llamada podría ser grande. Por ejemplo:

int remoteCall (int bigArray [1000000], int somethingElse);

Cada llamada a esta función utilizando una llamada por valor requeriría 4 MB de tráfico de red.

El problema con la llamada por referencia es que requiere llamadas a procedimientos remotos al origen para recuperar (o establecer) los valores de las referencias a pedido. Usando la misma función de ejemplo, para implementar la llamada por referencia necesitamos una forma para que el servidor llame al cliente y recupere una parte de la matriz, a saber, otro RPC:

int getArrayElement (int bigArray [], int index);

(Para evitar una regresión infinita, necesita * algún * tipo de llamada por valor, de lo contrario, nunca podría desreferenciar el ‘índice’ en sí mismo).

Si el número de elementos accedidos es pequeño, esto podría ser un ahorro significativo en el tráfico de red, pero a costa de una latencia mucho mayor. También complica la capa RPC, ya que necesita un identificador de objeto que le permita saber quién “realmente” posee bigArray para que sepa con quién hablar para desreferenciarlo. Y cada cliente debe ser un servidor, y usted debe resolver el problema de quién aceptar las solicitudes.

Un enfoque alternativo es hacer que se vea en el nivel de API es llamada por referencia, pero lo que sucede debajo del capó es en realidad llamada por valor. Se guarda una copia local de los valores en el servidor y las versiones modificadas de los valores se devuelven en la respuesta.

Por lo general, la latencia es más importante que el rendimiento de la red, y la simplicidad es muy importante, por eso se utiliza la semántica de llamada por valor. Se aplica algún pensamiento de ingeniería para evitar hacer cosas tontas como enviar alrededor de matrices de 4 MB.