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

标签 java performance ipc rmi mq

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

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

我不确定性能规范的最佳方法是什么。

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

还有什么想法吗?

最佳答案

I wonder if RMI is efficient in terms of Performance, I think it require some overhead.

RMI 的效率很高。它所做的远远超过大多数人的需要,但通常也足够快了。您应该能够以大约 1 毫秒的延迟获得每秒 1-3 K 条消息的数量级。

What about TCP/IP socket using local host?

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


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

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

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

  • 超快速的序列化和反序列化,大多数传输基准测试都避免将其包含在内,因为它通常比传输成本花费的时间长得多。
  • 是您可以在消息发送后随时监控队列之间发生的情况。
  • 重播所有消息。
  • 生产者可以先于您的消费者处理任意数量的数据,以优雅地处理微突发,直至您的磁盘空间大小。例如消费者可能落后 TB。
  • 支持通过 TCP 进行复制。
  • 消费者或生产者的重启在很大程度上是透明的。

关于java - 最高效 - 性能明智 - 用于 JVM 间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14580337/

相关文章:

c# - 为什么在尝试使用 WCF 在 2 个应用程序之间进行通信时出现异常(TCP 错误代码 10061)?

c# - 将数据从 C# 传递到 Electron

java - 找出方法以编程方式抛出的异常

performance - Jmeter - 带有计数器配置元素的 While Controller

php - 大型数组的 PHP QuickHash 经验

clojure - Python3 关闭 IPC

java - ArrayList 使用 addAll() 编译器显示了泛型的不同行为

javascript - 有没有办法在 swagger-ui 3.* 中只呈现特定的 api 端点?

java - 有没有办法在 Spring Batch 中调用 writer 之前拦截并注入(inject)另一个对象?

mysql - 如何提高MySQL查询速度