使用Java RMI的优缺点

11
RMI的优缺点是什么?
2个回答

12

优缺点类似于任何RPC(远程过程调用)系统。 表面上看来很简单,因为实际上是远程的对象可以像本地对象一样处理。

这似乎对编程的简易性有很大好处,但却存在隐藏的成本。 分布式系统存在延迟和部分故障的问题,程序员必须意识到这一点。 调用远程方法可能会受到安全性、延迟问题、网络故障等潜在故障的影响。 掩盖这些问题可能会导致可靠性灾难。


感谢您提供这篇论文的链接。我可以完美地在我的论文中使用它 :) - Daff
说得好。尽管我写了一本关于RMI的书,但我实际上并不是一个支持者。它让看起来很简单的事情变得非常复杂,而让实际上并不那么困难的事情变得困难,例如“我应该重试吗?” - user207421
4
不再链接到“Waldo等人”的内容。 - Faisal Ashfaq

5

根据我的经验:

优点:

  • 易于入门
  • 动态类加载非常强大
  • 如果您实现像下面这样的内容,则可以长时间不更改服务器端并开发客户端(一个例外是rmi服务器必须在classpath中获取这些类-因此要么通过网络提供它们,要么包含它们并重新构建服务器)

您可以实现两个如下所示的接口:

通用任务接口:

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();
    }

}

示例客户端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(),但是神奇的客户端可能会覆盖此方法并在其中执行任何操作...
  • 难以实现通过Internet工作的回调(它需要从服务器到客户端建立新连接 - 可能很难通过NAT /路由器/防火墙传递)
  • 当您在远程方法执行期间突然断开连接时,该方法可能不会返回(我建议将rmi调用封装到Callable中,并使用定义的超时运行它们)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接