我需要从在同一台机器上运行的另一个 JVM 调用一个方法。这些方法需要以类似 Java/native 的性能调用很多次。是一种小投入小产出的方法。另一个 JVM 在同一台机器上运行。
进行此调用并从“附近”运行的其他 JVM 检索结果的最快方法是什么?
一些选项可能是 RMI、管道、套接字、JMS、优化的同机 JVM 间通信支持、JVM 中的一些低级 hack。欢迎任何想法,无论它多么专业。
在同一台机器上的 JVM 之间进行通信的最快方式是使用共享内存,例如通过内存映射文件。这比使用 Socket over loopback 快 100 倍。例如,200 ns 的往返时间与 10-20 微秒的 Socket 往返时间。
一种实现是Java Chronicle BTW 100 ns 延迟包括消息的持久性。
您是否需要这些解决方案中的任何一个都不应该是理所当然的。通常,当人们说他们必须拥有“最快”时,他们的真正意思是他们不知道它需要多快,所以如果他们选择最快的应该是正确的解决方案。这通常是不正确的,因为采用最快的解决方案通常意味着在设计和实现中做出妥协,如果你知道真正的需求是什么,那么它可能永远不需要。
简而言之,除非您有特定的、可测量的延迟和/或吞吐量要求,否则您应该假设最简单的解决方案就是您真正想要的。如果您对所需内容有了更好的了解,如果发现它不适合,则可以用更快的方法替换它。
另一种可能性是0MQ (ZeroMQ),尽管这取决于您所说的“最快”的含义 - zeromq 非常适合吞吐量,但如果您绝对必须具有尽可能低的延迟,它可能不是最佳的。
ZeroMQ 对两个 JVM 来说可能是多余的,但它的优点是,如果您以后想将其中一个 JVM 移动到另一台机器上,或者与非 Java 进程通信,ZeroMQ 仍然可以正常工作 - 并且它可以扩展到更大规模,也更复杂的通信。