Преимущества и недостатки использования Java RMI - PullRequest
9 голосов
/ 26 февраля 2010

Каковы преимущества и недостатки RMI?

Ответы [ 2 ]

12 голосов
/ 26 февраля 2010

Преимущества и недостатки аналогичны преимуществам любой RPC-подобной (удаленной процедуры вызова) системы. Это выглядит поверхностно, потому что объекты, которые на самом деле являются удаленными, могут рассматриваться как локальные.

Это может показаться большим преимуществом для простоты программирования, но есть скрытые затраты. Распределенные системы имеют проблемы с задержкой и возможностью частичного сбоя, о которых должен знать программист. При вызове удаленного метода возможны сбои из-за проблем безопасности, задержек, сбоев в сети и т. Д. Распространение таких проблем может стать катастрофой для надежности.

Уолдо и др. хорошо обсудили вопросы.

5 голосов
/ 30 октября 2012

Из моего опыта:

Плюсы:

  • Легко начать
  • Динамическая загрузка классов очень мощная
  • Если вы реализуете что-то, как показано ниже, вы не сможете долгое время менять сторону сервера и разрабатывать клиент (одно исключение на сервере 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 вызывает method() на PassedObject, но чудесный клиент может переопределить этот метод и выполнить все, что он хочет там ...
  • трудно реализовать обратный вызов, который будет работать через Интернет (для этого необходимо установить новое соединение с сервера на клиент - может быть сложно передать его через NAT / маршрутизаторы / брандмауэры)
  • когда вы внезапно разорвали соединение во время выполнения удаленного метода, случается, что этот метод не вернется (я рекомендую оборачивать вызовы rmi в Callable s и запускать их с определенным временем ожидания).
...