5

用例:一个 Java 进程和一个或两个 C++ 进程,总是在同一台机器上。需要双向、二进制、非持久通信。其中一个 C++ 进程负责实例化其他进程。

我环顾四周,看到了 XML/JSON-RPC、Protocol Buffers、Thrift、zeromq 等。

如果可能的话,可移植性会很好,但需要 Windows XP/7。

4

2 回答 2

12

通常,您应该在设计中将消息传输和消息反序列化分开,并尽可能保持它们正交。简而言之,将数据(消息)流行为与消息内容分离。

  1. 有几种面向消息的传输框架,允许为线程、进程之间的客户端/服务器通信(请求/回复、发布/订阅、推/拉等)的某些行为模式发送和接收中性有效负载数据(消息)和网络服务作为客户端和服务器实例。
  2. 有许多框架以传输中性(例如,提供用于交换独立于机器字节序的本机整数数据的有线格式)方式提供有效载荷(消息)数据的反序列化/序列化。
  3. 对于您的特定用例,最佳组合选择是什么,取决于您对设计决策的许多要求和约束:

    • 作为线程、进程或服务器/进程的客户端/服务器处理单元的可扩展性
    • 整体性能和消息延迟
    • 处理单元资源需求(例如堆内存或代码大小)
    • 网络资源影响(通过网络接口发送的内容)
    • ETC。 ...

可能的解决方案:
我认为ZMQ 消息传递框架与Google Protobuf消息框架相结合可以为您的用例提供可行的解决方案。有针对的语言绑定(请参阅ZMQ Java 绑定),您将拥有针对进程间和线程间通信的优化实现。ZMQ 连接以类似套接字的方式设计,支持双向(请求/回复)通信模式以及单向(发布/订阅、推/拉)通信模式。

如前所述,消息内容的格式取决于您,但Google Protobuf可能适用于内部定义的消息协议,这些协议支持 C++ 和 Java 语言绑定。Google Protobuf还提供了一种机制来定义RPC 服务接口,但您必须为客户端/服务器实现提供具体的消息传输协议。我从未通过 ZMQ 传输实现这一点,但如果有必要,它应该是可能的。

XML/JSON-RPC 可能被考虑用于发布(例如通过 REST 服务)协议(使用 ZMQ 桥接相当容易)。

考虑到您的要求,我猜后面的协议格式选项不是必需的,但可能很有用,具体取决于您打算与 Java/C++ 参与者一起使用的框架。

AFAIK ZMQ 符合您对 Windows XP/7 平台的可移植性限制。不确定,但 Windows 系统上的线程间通信可能存在限制。但这似乎不适用于您描述的场景。

替代传输框架:

  1. 活动MQ
  2. Boost asio(C++ 包装的本机套接字,我不了解 java 端,请随意增强此信息)

备用消息编码/解码框架:

  1. XML-RPC C++ / java(通常假设 HTTP 传输)
  2. JSON
于 2013-01-25T20:29:40.090 回答
1

根据问题评论中的信息,我想协议缓冲区是需要考虑的东西——它在线上具有二进制格式,具有简单的 API,并且不提供任何冗余的东西,例如持久性。

于 2012-05-08T20:45:03.977 回答