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