我正在尝试使用Java RMI远程轮询队列。 RMI是一个很好的方法吗?总的来说,使用RMI比常规套接字编程有什么好处?它在网络带宽使用方面更有效吗?
答案 0 :(得分:3)
RMI是一个很好的方法吗?
可能是。 RMI非常简单,并且受到许多框架的支持。
总的来说,使用RMI比常规套接字编程有什么好处?
适用于各种用途的简单性。
在网络带宽使用方面是否更有效?
RMI建立在常规套接字编程之上,因此无法提高效率。但是,就网络带宽而言,它比使用自定义代码可以实现的程度差2-5倍,当然除非您需要使用自定义编码。您发送的是大byte[]
或String
,但它不会产生太大影响。
注意:这不是不使用RMI的好理由。使用更快的替代方案是不合理的,除非您知道这将是一个问题并且通常不是。
注意:如果使用RPC使用另一个序列化,则最有可能提高效率。即几乎所有替代品都更有效。
答案 1 :(得分:0)
我说RMI提供的最方便的优点是在另一台机器上调用方法并通过网络返回对象是多么简单,让存根处理编组/解组。然而,假设你做得很好,它肯定不比在套接字上构建你自己的低级别通信层更有效:)
您的情况可能适合,在一台机器上使用pollQueue()方法,它只能将您存储在队列中的对象返回给调用的Java应用程序。
答案 2 :(得分:0)
与往常一样,答案取决于您的应用程序的需求以及您编写代码的时间/预算。那就是说,我提出这个意见。
如果您需要同步远程过程调用,则在简单性方面无法击败RMI。您存根接口并使用它来直接调用远程计算机上的对象。然而,它并没有没有开销,因为除了阻塞本地机器上的调用线程之外,每个过程调用都在远程机器上的新线程中运行,直到过程完成或失败。它还可能引入难以排除故障的同步问题(如果您不小心计划提供的对象的线程安全性,则链接的RMI调用可能会导致多台计算机出现死锁)。如果您了解如何有效使用Serializable
或Externalizable
,则带宽不会成为问题。
但是,如果您需要直接的速度/性能或对通过网络发送的数据进行精细控制,那么最好使用套接字并实现自己的回调。 RMI本质上是同步的,但是使用套接字,您可以以异步,事件驱动的方式执行操作。但是,使用这种方法,将会有更多的编码开销,如果您需要实现的远程过程的数量变得很大,它会变得非常繁琐。