【问题标题】:Benefits and disadvantages of using java rmi使用 java rmi 的优缺点
【发布时间】:2010-02-26 06:25:38
【问题描述】:

RMI的优缺点是什么?

【问题讨论】:

    标签: java rmi


    【解决方案1】:

    优点和缺点类似于任何类 RPC(远程过程调用)系统的优点和缺点。表面上看起来很简单,因为实际上远程的对象可以被视为本地对象。

    这似乎对简化编程有很大好处,但也有隐藏的成本。分布式系统存在延迟问题和程序员必须注意的部分故障的可能性。远程方法的调用可能会因安全性、延迟问题、网络故障等而发生故障。对这些问题进行纸上谈兵可能会导致可靠性灾难。

    【讨论】:

    • 感谢本文的链接。我可以在我的论文中完美地使用它:)
    • 说得好。尽管我写了一本关于 RMI 的书,但我实际上并不是倡导者。它使事情看起来很简单,但实际上远非如此,它使实际上并不难的事情变得困难,例如。 “我应该重试吗?”
    • 不再链接到“Waldo et al”:|
    【解决方案2】:

    根据我的经验:

    优点:

    • 容易上手
    • 动态类加载非常强大
    • 如果您实现类似下面的内容,您将无法长时间更改服务器端并开发客户端(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();
        }
    
    }
    

    示例客户端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 调用包装到 Callables 并使用定义的超时运行它们)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 2010-09-12
      • 2016-05-14
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多