2010-02-26 40 views

Trả lời

12

Những ưu điểm và nhược điểm tương tự như của bất kỳ hệ thống RPC nào (gọi thủ tục từ xa). Có một sự xuất hiện bề ngoài của sự đơn giản, bởi vì nó đối tượng đó là trong thực tế từ xa có thể được coi như là chúng được địa phương.

Điều này có vẻ như là một lợi ích lớn cho tính đơn giản của lập trình, nhưng có chi phí ẩn. Các hệ thống phân tán có vấn đề về độ trễ và khả năng thất bại một phần mà lập trình viên phải biết. Một yêu cầu của một phương pháp từ xa là tùy thuộc vào khả năng thất bại từ an ninh, độ trễ vấn đề, mạng thất bại, vv. Papering trên các loại vấn đề có thể là một thảm họa cho độ tin cậy.

Waldo et al. có cuộc thảo luận tốt về các vấn đề.

+0

Cảm ơn bạn đã liên kết tới bài báo. Tôi hoàn toàn có thể sử dụng điều này trong luận án của tôi :) – Daff

+0

Cũng nói. Mặc dù tôi đã viết một cuốn sách về RMI nhưng tôi không thực sự là người biện hộ.Nó làm cho mọi thứ trở nên đơn giản, rất đơn giản, và nó làm cho mọi thứ trở nên khó khăn mà thực sự không khó như vậy, ví dụ 'Tôi có nên thử lại không?' – EJP

+3

Không còn liên kết đến "Waldo et al": | –

5

Từ kinh nghiệm của tôi:

Ưu điểm:

  • dễ dàng để bắt đầu
  • lớp tải động là rất mạnh mẽ
  • Nếu bạn thực hiện một cái gì đó giống như bên dưới, bạn không thể thay đổi phía máy chủ cho một chặng đường dài thời gian và phát triển ứng dụng khách (một ngoại lệ trên máy chủ rmi phải lấy các lớp này trong classpath - vì vậy hoặc là máy chủ trên mạng hoặc bao gồm chúng và xây dựng lại máy chủ)

Bạn có thể thực hiện hai giao diện như thế:

giao diện nhiệm vụ chung:

public interface Task<T extends Serializable> extends Serializable { 

    T execute(); 

} 

RMI giao diện:

public interface RmiTask extends Remote { 

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

} 

RmiTask thực hiện trên máy chủ phụ:

public class RmiTaskExecutor implements RmiTask { 

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

} 

Exampl e client Task thực hiệ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(); 
    } 

} 

Nhược điểm:

  • Có thể là không an toàn, khi sử dụng Dynamic lớp tải (khách hàng phục vụ thực hiện các loại thông qua) - ví dụ bạn biết rằng rmi máy chủ gọi method() trên PassedObject, nhưng khách hàng tuyệt vời có thể ghi đè phương thức này và thực thi bất cứ điều gì anh ta muốn ...
  • khó thực hiện gọi lại. Nó sẽ hoạt động qua Internet (cần thiết lập kết nối mới từ máy chủ đến máy khách). thông qua NAT/router/tường lửa)
  • khi bạn đột nhiên ngắt kết nối trong khi thực hiện phương pháp từ xa, điều này xảy ra là phương pháp này sẽ không trả về (tôi khuyên bạn nên đưa các cuộc gọi rmi vào Callable giây và chạy chúng với thời gian chờ xác định).
Các vấn đề liên quan