当数据被写入协议缓冲区时,我如何让Java触发C++程序,反之亦然

How can I have Java trigger C++ programs and vice versa when data is written to protocol buffers?

本文关键字:Java 触发 C++ 反之亦然 程序 协议 缓冲区 数据      更新时间:2023-10-16

长话短说,我有一个Java进程,它可以向进程读取数据,也可以向进程写入数据。我有一个C++程序,它获取数据,进行处理,然后需要将其传递回Java,以便Java可以将其写入数据库。

Java程序从Hadoop中提取数据,因此一旦Hadoop进程启动,它就会被数据淹没,但实际的处理(由C++程序完成)无法同时处理所有数据。所以我也需要一种控制流量的方法。同样为了使问题复杂化(但简化我的工作),我做Java的东西,我的朋友做C++的东西,并试图保持我们的程序尽可能独立。

这就是问题所在。我找到了谷歌协议缓冲区,在程序之间传递数据似乎很酷,但我不确定Java程序保存数据如何触发c++程序进行处理,然后当c++程序保存结果时,Java程序将如何触发以保存结果(这是针对一条或几条记录的,但我们计划处理数十亿条记录)。

解决这个问题的最佳方法是什么?有简单的方法吗?

最简单的方法可能是使用TCP套接字连接。Java程序会在您想要完成的时候发送,C++程序会发回结果。

由于您想要扩展此解决方案,我建议使用ZMQ。

让你的java应用程序仍然从Hadoop中提取数据。

然后,它将使用push套接字依次推出数据。

在这里,您将有尽可能多的c++工作人员,他们将处理作为PULL套接字接受连接的数据。这可以扩展到尽可能多的不同处理器/内核等。。。你需要的。

当每个工作程序完成时,它会将push套接字上的结果推送到"存储"java程序,该程序正在接受PULL套接字上的信息。

它看起来有点像这个例子(标准的分而治之方法)

当没有可用的工作者时,这个过程可以扩展到第一个java程序将阻止(但仍在处理)的工作者数量。只要你的java程序结束得很快,你就会看到它的伸缩性非常好。

发射和保存程序可以在同一程序中,只需使用zmq_poll设备:)