在两个JVM

时间:2015-09-11 13:50:48

标签: java jvm rmi chronicle chronicle-map

我在同一台机器上运行了两个Java应用程序。由于需要远程连接,我们通过http实现了inter-jvm通信。我们从一个vm到另一个传递大约10MByte imagedata每秒100次。随着写入功能花费了太多时间,我们得到了很大的延迟。由于速度是最重要的标准,因此可以跳过http作为要求。然后我们尝试了套接字,但它仍然太慢了。我已经阅读了关于快速jvm消息传递的RMI和Chronicle(openhft)。 Chonicle听起来很有趣,因为我们可以使用chronicle-queues进行消息传递和chronicle-map来共享图像数据。

但说实话,我无法估计什么是最好的。用例如下:服务器收集图像。 客户端请求可用图像列表。一旦客户端收到消息,客户端就会请求一个特定的图像。服务器已经加载了图像,需要将图像发送到客户端。有什么建议可以使用什么策略? 我们也可以将所有图像发送到客户端,但这会导致服务器使用太多时间发送数据,这是不需要的。

感谢您的提示。

2 个答案:

答案 0 :(得分:2)

您可以通过内存映射缓冲区将图像数据保存在tmpfs / shmem文件系统的文件中。然后,您只需要通知另一个进程它必须访问的文件名,例如通过持久的TCP连接。

答案 1 :(得分:0)

Chronicle Map and Queue专为低延迟存储而设计。在这种情况下,IPC至少快50倍,但是对于非常大的消息,低延迟不是问题,而是吞吐量/带宽。

如果您在本地计算机上,则应该能够通过环回TCP写入2 GB / s到4 GB / s。这相当于每秒200 - 400 x 10 MB的图像。

如果您有10 Gig-E网络连接,您应该能够每秒发送大约100 x 10 MB,但这将使用整个网络。

如果您只有1 Gb / s的网络连接,则您的带宽限制为每秒最多100 MB / s或10 x 10 MB。

解决此问题的一种方法是同时运行生成映像的应用程序和需要同一JVM中的映像的应用程序。这样你根本不需要担心TCP或IPC。