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

2022-09-04 07:27:30

对于以下情况,实现C++/Java IPC 的最佳方法是什么?

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

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

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

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

  4. 理想的解决方案应具有a)非常低的延迟,b)没有安全问题(用户不必授权打开端口等)和c)将与平台无关。

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

有什么建议吗?

谢谢!

后续问题

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

答案 1

我建议你使用TCP套接字

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

实际上,在我的Java应用程序中,我已经测量了垃圾回收器的影响远远比“环回”TCP套接字引起的延迟更重要。

此外,TCP套接字比传统的IPC更具可扩展性(和便携性!如果将来您必须在不同的计算机上运行客户端和服务器,该怎么办?在“TCP套接字”场景中,您必须进行5分钟的黑客攻击,在“传统IPC”场景中,您必须重写整个IPC内容。

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

即使不需要确认,我也建议使用TCP(而不是UDP)来避免未排序的传递(这在重新排列您收到的内容时会导致屁股疼痛 - 您的一些消息是100KB,这不适合UDP数据包)。

在回答您的最后一个问题时,为了让服务器通知客户端有关端口的信息,您可以只让服务器使用特定的“port”命令行参数启动客户端,或者让服务器在/tmp(或其他临时目录)下保存一个小文件,并在其中写入端口号。


答案 2

我听说过ZeroMQ的好东西,特别是这些场景。在某些情况下,它甚至吹嘘比TCP更快。简而言之,尝试一下肯定不会有什么坏处。


推荐