使用 Java 的 RMI 的优点

Advantages of using Java's RMI

我正在尝试使用 Java RMI 远程轮询队列。 RMI 是执行此操作的好方法吗?总体而言,与常规套接字编程相比,使用 RMI 有哪些优势?它在网络带宽使用方面是否更有效率?

Is RMI a good method to do this?

可能是。 RMI 非常简单,并且受到许多框架的支持。

Overall, what are the advantages of using RMI over regular socket programming?

多种用途的简单性。

Is it more efficient in terms of network bandwidth usage?

RMI 建立在常规套接字编程之上,因此效率再高不过了。然而,就网络带宽而言,它比您使用自定义代码所能达到的效果差 2-5 倍,当然您需要使用自定义编码除外。您发送的是大 byte[]String 它不会有太大区别。

注意:这不是不使用 RMI 的好理由。使用更快的替代方案不太可能是合理的,除非您知道这将是一个问题而且通常不会。

注意:如果您使用 RPC 使用另一个序列化,它很可能会更有效率。即几乎所有替代方案都更有效。

我想说 RMI 提供的最方便的优势是在另一台机器上调用方法并通过网络 returning 对象是多么简单,让存根处理 marshalling/unmarshalling .然而,它肯定不会比通过套接字构建自己的低级通信层更有效,假设你做得很好:)

你的情况可能适合,在一台机器上使用 pollQueue() 方法,它可以 return 你存储在队列中的对象到调用 Java 应用程序。

一如既往,答案取决于您的应用程序的需要和您必须编写代码的 time/budget。话虽如此,我提出这个意见。

如果您需要同步远程过程调用,就简单性而言,您无法击败 RMI。你存根一个接口并用它来直接调用远程机器上的对象。然而,它并非没有开销,因为每个过程调用都会在远程机器上的一个新线程中获得 运行 除了阻塞本地机器上的调用线程直到过程完成或失败。它还会引入难以解决的同步问题(如果您不注意计划提供的对象的线程安全性,链式 RMI 调用可能会导致跨多台机器的死锁)。如果您了解如何有效地使用 SerializableExternalizable,带宽将不是问题。

但是,如果您需要完全 speed/performance 或精细控制通过网络发送的数据,最好使用套接字并实现您自己的回调。 RMI 本质上是同步的,但使用套接字,您可以以异步、事件驱动的方式做事。然而,使用这种方法,将会有更多的编码开销,如果您需要实现的远程过程的数量变大,它会变得非常乏味。