哪种rpc/messaging框架最适合这种情况?

Rha*_*aun 4 c++ java messaging rpc asynchronous

用例:一个带有一个或两个C++进程的Java进程,始终位于同一台机器上.需要双向,二进制,非持久通信.其中一个C++进程负责实例化其他进程.

我看了一下,看看像XML/JSON-RPC,Protocol Buffers,Thrift,zeromq等.

如果可能,便携性会很好,但需要Windows XP/7.

πάν*_*ῥεῖ 10

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

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

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

可能的解决方案:
我认为ZMQ消息传递框架结合Google Protobuf消息framwework可以为您的用例提供可行的解决方案.有语言绑定(参见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. ActiveMQ的
  2. Boost asio(C++包装的原生套接字,我不知道java方面随时可以增强此信息)

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

  1. XML-RPC C++/java(通常假设HTTP传输)
  2. JSON