使用java rmi的优点和缺点

问题描述:

RMI的优缺点是什么?使用java rmi的优点和缺点

的优点和缺点是类似于任何类RPC(远程过程调用)系统的研究。有一种简单的表面外观,因为它实际上是遥远的对象,可以视为它们是本地的。

这似乎是一个很大的好处编程简单,但也有隐性成本。分布式系统存在程序员必须注意的延迟问题和部分故障的可能性。对远程方法的调用可能会因安全性,延迟问题,网络故障等原因而导致失败。对这些问题进行归档可能会导致可靠性的灾难。

Waldo et al.有问题了很好的讨论。

+0

感谢您的链接到纸张上。我可以在我的论文中完美地使用这个:) – Daff 2010-02-26 07:05:30

+0

那么说。即使我写了一本关于RMI的书,我实际上并不是一个倡导者。它使事情变得简单,远非简单,而是让事情变得困难,实际上并不困难,例如'我应该重试吗?' – EJP 2010-02-26 07:18:34

+3

此网页连接至:“Waldo et al”:| – 2014-12-01 16:57:52

从我的经验:

优点:

  • 易于启动
  • 动态类加载如果要实现类似下面你不能改变服务器端很长一段是非常强大的
  • 时间和开发客户端(rmi服务器上的一个例外必须在类路径中获得这些类 - 所以要么通过网络服务它们,要么包括它们并重建服务器)

您可以实现这样的两个接口:

共同任务界面:

public interface Task<T extends Serializable> extends Serializable { 

    T execute(); 

} 

RMI接口:

public interface RmiTask extends Remote { 

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

} 

RmiTask在服务器端执行:

public class RmiTaskExecutor implements RmiTask { 

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

} 

为例E客户Task实现:

public class IsFileTask implements Task<Boolean> { 

    final String path; 

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

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

} 

缺点:

  • 可能是不安全的,使用动态类装载(客户服务实现通过类型)时 - 例如,你知道,RMI服务器上PassedObject调用method(),但奇妙的客户可以重写此方法并执行任何他想要有...
  • 难以实现回调这将工作通过互联网(它需要建立从服务器到客户端新的连接 - 它可以是具有挑战性的传递通过NAT /路由器/防火墙)
  • 当你突然打破了远程方法的执行过程中它发生,这种方法不会返回(我建议包装RMI调用到Callable S和具有确定超时运行它们)的连接。