9

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

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

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

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

还有其他想法吗?

4

2 回答 2

18

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

RMI 的工作效率很高。它做的比大多数人需要的要多得多,但通常足够快。您应该能够以大约 1 毫秒的延迟获得每秒 1-3 K 条消息。

使用本地主机的 TCP/IP 套接字怎么样?

这始终是一个选项,但使用纯 Java 序列化不会比使用 RMI 快很多。如何进行序列化和反序列化对于高性能至关重要。


一个重要的注意事项是,大部分时间都花在序列化和反序列化消息上,大多数传输无法帮助您,因此如果您想要获得最大性能,您必须考虑有效的编组策略。大多数传输协议仅对原始字节进行基准测试。

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

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

  • 超快速的序列化和反序列化,大多数传输基准都避免包括这一点,因为它通常需要比传输成本更长的时间。
  • 是您可以在消息发送后随时监控队列之间发生的情况。
  • 重播所有消息。
  • 生产者可以在您的消费者之前处理任何数量的数据,以优雅地处理微突发,直至您的磁盘空间大小。例如,消费者可能落后于 TB。
  • 支持通过 TCP 进行复制。
  • 消费者或生产者的重启在很大程度上是透明的。
于 2013-01-29T10:20:39.533 回答
3

如果您正在开发服务器应用程序,请尝试考虑 ZeroMQ。它具有出色的性能,允许更轻松地构建进程间通信,允许构建异步 API。

ZeroMQ通过 InterProcess 通信宣布了出色的性能。甚至比 TCP 还要好听起来很棒。我们正在为我们的集群化模式考虑这个解决方案。

Pieter Hintjens 对不同 Message Broker 之间的性能比较给出了很好的答案

于 2013-01-29T10:15:06.700 回答