哪种 rpc/消息传递框架最适合这种情况?

2023-12-30

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

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

如果可以的话,便携性就好了,但是需要Windows XP/7。


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

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

    • 客户端/服务器处理单元(如线程、进程或服务器/进程)的可扩展性
    • 整体性能和消息延迟
    • 处理单元资源需求(例如堆内存或代码大小)
    • 网络资源影响(通过网络接口发送的内容)
    • 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 系统上的线程间通信可能存在限制。但这似乎不适用于您所描述的场景。

替代运输框架:

  1. ActiveMQ http://activemq.apache.org/
  2. 升压asio http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/overview.html(C++ 包装的本机套接字,我不知道 java 方面,请随意增强此信息)

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

  1. XML-RPC C++ http://xmlrpc-c.sourceforge.net//java http://ws.apache.org/xmlrpc/(通常假设 HTTP 传输)
  2. JSON http://www.json.org/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪种 rpc/消息传递框架最适合这种情况? 的相关文章

  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 使用反射获取基类的受保护属性值

    I would like to know if it is possible to access the value of the ConfigurationId property which is located in the base
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • HTTP PUT 在 Java 中上传文件

    Edit 我想我已经弄清楚如何执行二进制数据部分 仔细检查代码 但我很确定我做对了 现在 当我尝试按照中所述完成上传时遇到新错误Vimeo API 文档 http vimeo com api docs upload streaming Ed
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 是否可以为 azure blob 存储中的给定目录生成具有写入权限的 SAS(共享访问签名)

    我们的 blob 存储帐户结构 容器名称 simple 在这个容器内我们有 blob aa one zip aa two zip bb ss zip bb dd zip 是否可以生成对aa 目录 有写权限 但对bb 目录 没有访问权限的SA
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • 方法签名中带或不带synchronized关键字的方法具有相同的字节码

    对于以下 2 个类 获得相同的 Java 字节码 java版本 java 版本 1 8 0 181 Java TM SE 运行时环境 构建 1 8 0 181 b13 Java HotSpot TM 64 位服务器 VM 内部版本 25 1
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 将一个 long 转换为两个 int 以进行重构

    我需要将一个参数作为两个 int 参数传递给 Telerik Report 因为它不能接受长参数 将 long 拆分为两个 int 并在不丢失数据的情况下重建它的最简单方法是什么 使用掩蔽和移位是最好的选择 根据文档 long 保证为 64
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • Libgdx 和 Google 应用内购买结果

    我遵循了这些指示 https github com libgdx libgdx wiki Interfacing with platform specific code使用 ActionResolver 接口集成 Libgdx 和原生 An

随机推荐