最高效 - 性能明智 - 用于JVM间通信

use*_*026 8 java performance ipc rmi mq

我有一个Java应用程序,需要在不同进程之间进行通信.进程可以在相同的JVM或不同的JVM中运行,但可以在同一台机器上运行.

我的应用程序需要将"消息"提交给另一个进程(相同或不同的JVM)并忘记它.类似于IBM"MQ"之类的消息传递队列,但是简单,只使用内存,没有IO到硬盘以获得性能提升.

我不确定Performance prescriptive的最佳方法是什么.

  • 我想知道RMI在性能方面是否有效,我认为它需要一些开销.
  • 那么使用本地主机的TCP/IP套接字呢?

还有其他想法吗?

Pet*_*rey 17

我想知道RMI在性能方面是否有效,我认为它需要一些开销.

RMI对其功能非常有效.它比大多数人需要的要多得多,但通常足够快.您应该能够获得每秒1-3 K消息的顺序,延迟大约为1毫秒.

那么使用本地主机的TCP/IP套接字呢?

这总是一个选项,但使用普通的Java序列化,这不会比使用RMI快得多.如何进行序列化和反序列化对于高性能至关重要.


一个重要的注意的是,大部分的时间都花在序列化和deserilizing消息,而大多数传输不帮你,所以如果你想要最大的性能,你必须要考虑的一个有效的编组策略.大多数传输协议仅对基准原始字节进

具有讽刺意味的是,如果您愿意使用磁盘,它可能比TCP或UDP(如ZeroMQ)更快,而且您可以获得"免费"的持久性.

这个库(我是作者)可以在进程之间每秒执行数百万条消息,延迟低至100纳秒(比ZeroMQ低350倍)https://github.com/peter-lawrey/Java-Chronicle 优点是

  • 超快速序列化和反序列化,大多数传输基准都避免包括这一点,因为它通常比运输成本花费更长的时间.
  • 是您可以在发送邮件后随时监控队列之间发生的事情.
  • 重播所有消息.
  • 生产者可以在消费者面前提供任意数量的数据,以便优雅地处理微爆,最大可达磁盘空间大小.例如,消费者可能落后于TB.
  • 支持通过TCP进行复制.
  • 重新启动消费者或生产者在很大程度上是透明的.

  • ZeroMQ 仍然使用系统调用并且这些需要时间。尤其是如果您在内核中添加大约 10 - 30 微秒的延迟。通过在进程之间共享内存映射文件,消息可以从一个进程传递到另一个进程,而无需系统调用或涉及内核。必须进行一些系统调用来增大文件,但默认情况下是每 128 MB 一次。 (2认同)