C++和Java之间的低延迟IPC

Ton*_*ony 13 c++ java sockets java-native-interface ipc

在以下情况下实施C++/Java IPC的最佳方法是什么?

(有人最近问了一个类似的问题,但我的要求更具体)

  1. 我有两个程序 - 一个用C++编写,另一个用Java编写 - 需要相互通信.两者都在同一台机器上运行.

  2. 程序相互发送消息.消息通常很短(少于几百字节),但可能大小为100KB或更多.

  3. 消息不需要被确认(即,不是像HTTP那样的请求/响应模型).例如,C++程序向Java程序发送消息,Java程序可以通过稍后向C++程序发送消息来回复 - 反之亦然.

  4. 一个理想的解决方案是:a)非常低的延迟,b)没有安全麻烦(用户不必授权打开端口等)和c)将是平台无关的.

我的第一个想法是使用套接字 - 每个程序都充当另一个程序的服务器.套接字比其他形式的IPC有更多的开销,如果我让系统自动分配端口号,我不知道服务器如何通知客户端端口号.我也考虑过命名管道,但不同平台不支持它们(至少不一致). JNI看起来像一个选项,但它可以跨越流程边界吗?

有什么建议?

谢谢!

后续问题

  1. 如果我使用套接字,我是否需要打开两个套接字以允许异步通信,如上所述?

gd1*_*gd1 9

我建议你使用TCP套接字.

根据我的经验,TCP套接字的实际开销与其他任务的应用程序工作负载相比非常低,至少是我用来开发的应用程序.我的意思是,有时即使套接字的延迟是其他IPC机制的延迟的两倍,在整个工作流程中它们的影响也很小.它为您节省了在Java应用程序和C++之间进行IPC的麻烦,最终需要您使用使用JNI的特定Java库,以及JNI和库本身的开销.

在我的Java应用程序中,我实际上已经测量过,垃圾收集器的影响比" 环回 "TCP套接字引起的延迟要重要得多.

此外,TCP套接字比传统IPC更具可扩展性(并且可移植!).如果将来你必须在不同的机器上运行客户端和服务器怎么办?在"TCP套接字"场景中,你将不得不做5分钟的黑客攻击,在"传统的IPC"场景中,你将不得不重写整个IPC的东西.

但是,您的应用程序的一般工作流程是什么?

即使不需要确认,我建议使用TCP(而不是UDP)来避免未经分类的传送(当重新排列收到的内容时会导致痛苦 - 你的一些消息是100KB,这个不适合UDP数据包).

在回答您的上一个问题时,要让服务器通知客户端端口,您可以让服务器使用特定的"端口"命令行参数启动客户端,或者让服务器在/ tmp下保存一个小文件(或另一个临时目录),里面写有端口号.


San*_*rma 6

我已经听说ZeroMQ特别针对这些场景.在某些情况下,它甚至比TCP更快.总之,试一试肯定不会受到伤害.


Wou*_*ons 5

另一种方法是使用内存映射文件并通过检查编译器设置来保持它的可移植性,如果你是 posix 或不是。POSIX 操作系统有mmap()并且在 Windows 中你会使用CreateFileMapping()

在 boost 库中是 C++ 的可移植实现,在 java 中你应该能够使用FileChannel().

该页面很好地解释了如何将其用于 IPC http://en.wikipedia.org/wiki/Memory-mapped_file