用例:一个 Java 进程和一个或两个 C++ 进程,总是在同一台机器上。需要双向、二进制、非持久通信。其中一个 C++ 进程负责实例化其他进程。
我环顾四周,看到了 XML/JSON-RPC、Protocol Buffers、Thrift、zeromq 等。
如果可能的话,可移植性会很好,但需要 Windows XP/7。
用例:一个 Java 进程和一个或两个 C++ 进程,总是在同一台机器上。需要双向、二进制、非持久通信。其中一个 C++ 进程负责实例化其他进程。
我环顾四周,看到了 XML/JSON-RPC、Protocol Buffers、Thrift、zeromq 等。
如果可能的话,可移植性会很好,但需要 Windows XP/7。
通常,您应该在设计中将消息传输和消息反序列化分开,并尽可能保持它们正交。简而言之,将数据(消息)流行为与消息内容分离。
对于您的特定用例,最佳组合选择是什么,取决于您对设计决策的许多要求和约束:
可能的解决方案:
我认为ZMQ 消息传递框架与Google Protobuf消息框架相结合可以为您的用例提供可行的解决方案。有针对c++和java的语言绑定(请参阅ZMQ Java 绑定),您将拥有针对进程间和线程间通信的优化实现。ZMQ 连接以类似套接字的方式设计,支持双向(请求/回复)通信模式以及单向(发布/订阅、推/拉)通信模式。
如前所述,消息内容的格式取决于您,但Google Protobuf可能适用于内部定义的消息协议,这些协议支持 C++ 和 Java 语言绑定。Google Protobuf还提供了一种机制来定义RPC 服务接口,但您必须为客户端/服务器实现提供具体的消息传输协议。我从未通过 ZMQ 传输实现这一点,但如果有必要,它应该是可能的。
XML/JSON-RPC 可能被考虑用于发布(例如通过 REST 服务)协议(使用 ZMQ 桥接相当容易)。
考虑到您的要求,我猜后面的协议格式选项不是必需的,但可能很有用,具体取决于您打算与 Java/C++ 参与者一起使用的框架。
AFAIK ZMQ 符合您对 Windows XP/7 平台的可移植性限制。不确定,但 Windows 系统上的线程间通信可能存在限制。但这似乎不适用于您描述的场景。
替代传输框架:
备用消息编码/解码框架:
根据问题评论中的信息,我想协议缓冲区是需要考虑的东西——它在线上具有二进制格式,具有简单的 API,并且不提供任何冗余的东西,例如持久性。