2010-02-26 77 views

Respuesta

12

Las ventajas y desventajas son similares a las de cualquier sistema similar a RPC (Llamada a procedimiento remoto). Hay una apariencia superficial de simplicidad, porque los objetos que de hecho son remotos pueden tratarse como si fueran locales.

Esto parecería un gran beneficio para la simplicidad de la programación, pero existen costos ocultos. Los sistemas distribuidos tienen problemas de latencia y potencial de falla parcial que el programador debe conocer. Una invocación de un método remoto está sujeta a posibles fallas de seguridad, problemas de latencia, fallas de la red, etc. El papeleo sobre este tipo de problemas puede ser un desastre para la confiabilidad.

Waldo et al. tienen una buena discusión de los problemas.

+0

Gracias por el enlace al documento. Puedo usar esto perfectamente en mi tesis :) – Daff

+0

Bien dicho. Aunque escribí un libro sobre RMI, en realidad no soy un defensor.Hace que las cosas parezcan simples que están muy lejos de ser simples, y hace las cosas difíciles que en realidad no son tan difíciles, p. '¿Debería volver a intentarlo?' – EJP

+3

Ya no hay enlace para "Waldo et al": | –

5

Desde mi experiencia:

Pros:

  • Fácil de empezar
  • carga dinámica de clases es muy potente
  • Si implementa algo así como más adelante no se puede cambiar de servidor para una larga tiempo y desarrollo del cliente (una excepción en el servidor de rmi tiene que obtener estas clases en classpath, por lo tanto, sea servidor en red o incluirlas y reconstruir el servidor)

Se puede implementar dos interfaces así:

interfaz tarea común:

public interface Task<T extends Serializable> extends Serializable { 

    T execute(); 

} 

Rmi interfaz:

public interface RmiTask extends Remote { 

    <T extends Serializable> T executeTask(Task<T> task) throws RemoteException; 

} 

RmiTask aplicación del lado del servidor:

public class RmiTaskExecutor implements RmiTask { 

    public <T extends Serializable> T executeTask(Task<T> task) { 
     return task.execute(); 
    } 

} 

exampl e cliente Task aplicación:

public class IsFileTask implements Task<Boolean> { 

    final String path; 

    public IsFileTask(String path) { 
     this.path = path; 
    } 

    public Boolean execute() { 
     return new File(path).isFile(); 
    } 

} 

Contras:

  • Podría ser inseguro, cuando se utiliza la carga de clases Dinámica (cliente sirve aplicación de tipos pasado) - por ejemplo, se sabe que el servidor RMI llama method() en PassedObject, pero un cliente maravilloso podría anular este método y ejecutar lo que quiera allí ...
  • devolución de llamada difícil de implementar que funcionaría a través de Internet (necesita establecer una nueva conexión de servidor a cliente; puede ser difícil pasarla) a través de NAT/enrutadores/firewalls)
  • cuando de repente rompiste la conexión durante la ejecución del método remoto sucede que este método no volvería (recomiendo envolver llamadas rmi en Callable sy ejecutarlas con tiempos de espera definidos).
Cuestiones relacionadas