0

我有两个 Java 应用程序在同一台机器上运行。由于需要远程连接,我们通过 http 实现了 jvm 间通信。我们每秒将大约 10MByte 的图像数据从一个虚拟机传递到另一个虚拟机 100 次。使用 http 我们得到了巨大的延迟,因为 write-function 花费了太多时间。由于速度是最重要的标准,因此可以根据要求跳过 http。然后我们尝试了sockets,但是还是太慢了。我已经阅读了 RMI 和 Chronicle (openhft) 以实现快速的 jvm 间消息传递。Chonicle 对我来说听起来很有趣,因为我们可以使用 Chronicle-queues 进行消息传递,并使用 Chronicle-map 来共享图像数据。

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

感谢您的提示。

4

2 回答 2

2

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

于 2015-09-11T14:30:29.760 回答
0

Chronicle Map 和 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。

于 2015-09-18T21:50:38.053 回答