跨语言客户端/服务器的双向RPC选项

时间:2011-10-15 00:42:07

标签: python language-agnostic client-server rpc go

我正在尝试为一个项目提出一个想法,其中可以在python中开发客户端GUI,并且GUI可以由RPC中的可能任何其他语言的后端驱动。 更具体地说,现在我在客户端使用PyQt,而Go作为初始后端。

以下是我的目标:

  • PyQt客户端
    • 角色:查看,控制器
    • 单向调用(SIGNAL / SLOT),例如:button.clicked -> RPC.handleSignal
    • 请求/回复RPC ,例如:rowCount = model.rowCount -> RPC.call.model.rowCount
  • 不可知后端(在这种情况下去)
    • 角色:控制器,型号
    • 单向调用(发出信号),例如:model.dataChanged -> RPC.emitSignal

我将这些中的每一个称为具有控制器角色,因为用户可以在GUI客户端定义信号/插槽连接,或者后端可以在RPC上定义自己的信号/插槽连接,假设有关客户端上的视图的知识侧。这完全取决于用户想要如何设置控制器。

我现在正在看Thrift,而不是说没有IDL的轻量级基本rpc。但主要是我的问题是,尝试将Thrift作为两个.thrift文件,使用客户端/服务器< ---->是否会是一个混乱的方法。客户端/服务器(两个连接),以获得双向功能?我在Thrift中看到的好处是IDL,因此我可以专门构建我的接口,后端代码可以实现他们想要的部分。

有人建议解决此问题吗?两个Thrift接口?一个Thrift接口,它提供一个服务让客户端建立第二个简单套接字来接收来自服务器的单向调用?或者Thrift有点甚至过度杀戮?而后端 - > GUI界面实际上只是一个服务功能,GUI - >后端可以扩展一下(modelHandlers,slotHandlers,一般服务器状态查询)。

(编辑)更多想法

我的一部分认为模式可以使用任何RPC框架完成,它会是这样的吗?

  1. 后端服务器进程启动;侦听端口
  2. 客户端GUI启动;连接到服务器RPC;听新港口;通过RPC调用将端口发送到服务器
  3. 服务器从客户端接收端口,并绑定到第二个RPC连接
  4. 客户端和服务器有2个连接,用于双向RPC

1 个答案:

答案 0 :(得分:2)

当您通过TCP(或任何其他类似的基于连接的协议)连接到服务器时,在网络上连接PC时已经选择并侦听(伪/相对)随机端口以接收服务器答案。所以就此而言,只要服务器保持连接并且双方都保持连接存活,就已经有了双向连接。所以从技术的,低级别的角度来看,您不需要发起第二次连接

根据您的 RPC系统,它可能会也可能不会使用TCP,可能会也可能不会启用双向通信(或者更确切地说,是双向通信初始化)

现在,对于 thrift ,目前似乎没有太多文档(没有API参考)。但是检查示例代码似乎抽象了连接处理并仅使用请求/响应通信。所以在这种情况下,是的,你必须在定义的端口客户端监听并告诉服务器,这样服务器就可以启动请求/响应通信

Go 本身提供了rpc软件包,这是专有的数据,因此无法帮助您。

但是,它还提供 websocket。虽然最初的目标是webserver到webbrowser通信,但它是一个双向协议(毕竟它就是这样)并且可以被任何应用程序类型使用。它可能不是那么有效的大小/带宽,但它可以完成工作。

我不确定go包中的实现状态。 Conn类型确实有一个原始字段,但Conn.Dial函数示例传递http://localhost;我不确定这是否被一个可远程访问的websocket源替换。 Handler.ServeHTTP函数提供了一个http.ResponseWriter,您可以使用它来启动连接。 至少这是我要测试的第一件事。

另一种选择是,如果您对使用已定义的数据格式感到满意并且自己处理网络,则 protobuf 。有一个community project for go bindings to protobuf。然后,您可以自己处理TCP连接(连接到它并发送数据,接收数据,保存连接信息等)。

对于其他替代方案,您可能需要检查community packages page和/或community projects page(特别是Go Ajax和go-xmlrpc - 两者都非常简陋虽然如此)。