用例:一个 Java 进程与一个或两个 C++ 进程,始终在同一台机器上。需要双向、二进制、非持久通信。其中一个 C++ 进程负责实例化其他进程。
我环顾四周,看到了 XML/JSON-RPC、Protocol Buffers、Thrift、zeromq 等。
如果可以的话,便携性就好了,但是需要Windows XP/7。
一般来说,您应该在设计中将消息传输和消息反序列化分开,并尽可能保持它们正交。简而言之,将数据(消息)流行为与消息内容分离。
- 有几种面向消息的传输框架,允许在线程、进程之间针对客户端/服务器通信的某些行为模式(请求/答复、发布/订阅、推/拉等)发送和接收中性有效负载数据(消息)以及作为客户端和服务器实例的网络服务。
- 有许多框架以传输中立的方式提供有效负载(消息)数据的反/序列化(例如,提供一种用于交换独立于机器字节顺序的本机整数数据的有线格式)。
-
对于您的特定用例来说,最佳组合选择是什么,取决于您的设计决策的许多要求和约束:
- 客户端/服务器处理单元(如线程、进程或服务器/进程)的可扩展性
- 整体性能和消息延迟
- 处理单元资源需求(例如堆内存或代码大小)
- 网络资源影响(通过网络接口发送的内容)
- etc. ...
可能的解决方案:
我觉得ZMQ消息框架 http://zguide.zeromq.org/page%3aall结合谷歌协议缓冲区 http://code.google.com/p/protobuf/消息框架可以为您的用例提供可行的解决方案。有语言绑定c++ /questions/tagged/c%2b%2b and java /questions/tagged/java (see ZMQ Java 绑定 http://www.zeromq.org/bindings%3ajava)并且您将拥有进程间和线程间通信的优化实现。 ZMQ 连接以类似套接字的方式设计,支持双向(请求/回复)通信模式以及单向(发布/订阅、推/拉)。
如前所述,消息内容的格式由您决定,但是谷歌协议缓冲区 http://code.google.com/p/protobuf/可能适用于内部定义的消息协议,该协议支持 C++ 和 Java 语言绑定。谷歌协议缓冲区 http://code.google.com/p/protobuf/还提供了一种机制来定义RPC服务接口 https://developers.google.com/protocol-buffers/docs/proto#services,但是您必须为客户端/服务器实现提供具体的消息传输协议。我从未通过 ZMQ 传输来实现这一点,但如果有必要的话应该是可能的。
XML/JSON-RPC 可能会被考虑用于已发布的(例如通过 REST 服务)协议(使用 ZMQ 桥接相当容易)。
考虑到您的要求,我猜后面的协议格式选项不是必需的,但可能很有用,具体取决于您打算与 Java/C++ 参与者一起使用的框架。
AFAIK ZMQ 符合您对 Windows XP/7 平台的可移植性限制。不确定,但 Windows 系统上的线程间通信可能存在限制。但这似乎不适用于您所描述的场景。
替代运输框架:
- ActiveMQ http://activemq.apache.org/
-
升压asio http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/overview.html(C++ 包装的本机套接字,我不知道 java 方面,请随意增强此信息)
备用消息编码/解码框架:
- XML-RPC C++ http://xmlrpc-c.sourceforge.net//java http://ws.apache.org/xmlrpc/(通常假设 HTTP 传输)
- JSON http://www.json.org/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)