有一个Spyne客户端的例子吗?

cas*_*rco 6 python zeromq msgpack spyne

我正在尝试在我的服务器中使用spyne(http://spyne.io)和ZeroMQ和MsgPack.我已按照示例对服务器端进行编程,但我找不到任何帮助我了解如何编程客户端的示例.

我找到了类spyne.client.zeromq.ZeroMQClient,但我不知道它应该是它的构造函数的'app'参数.

先感谢您!

编辑:

(简化的)服务器端代码:

from spyne.application import Application
from spyne.protocol.msgpack import MessagePackRpc
from spyne.server.zeromq import ZeroMQServer
from spyne.service import ServiceBase
from spyne.decorator import srpc
from spyne.model.primitive import Unicode

class RadianteRPC(ServiceBase):    
    @srpc(_returns=Unicode)
    def whoiam():
        return "Hello I am Seldon!"

radiante_rpc = Application(
    [RadianteRPC],
    tns="radiante.rpc",
    in_protocol=MessagePackRpc(validator="soft"),
    out_protocol=MessagePackRpc()
)

s = ZeroMQServer(radiante_rpc, "tcp://127.0.0.1:5001")
s.serve_forever()
Run Code Online (Sandbox Code Playgroud)

Bur*_*lan 4

Spyne 作者在这里。

Spyne 的客户端传输存在许多问题。

首先也是最重要的是它们需要服务器代码才能工作。这是因为 Spyne 的 wsdl 解析器只完成了一半,因此无法将服务器向客户端公开的接口进行通信。

一旦 Wsdl 解析器完成,Spyne 的客户端传输也将恢复。虽然它们工作得很好,测试通过了,但它们(稍微)过时了,而且正如您所注意到的,没有适当的文档。

现在回到您的问题:客户端构造函数的 app 参数与服务器构造函数的应用程序实例相同。所以如果你这样做:

c = ZeroMQClient("tcp://127.0.0.1:5001", radiante_rpc)
print c.service.whoiam()
Run Code Online (Sandbox Code Playgroud)

它将打印“Hello I am Seldon!”

这是我刚刚提交的完整代码: https: //github.com/arskom/spyne/tree/master/examples/zeromq

综上所述,您不应该使用 ZeroMQ 进行 RPC。

当 ZeroMQ 的炒作达到疯狂水平时,我就将它用于 RPC 目的(我什至在 ZeroMQ 贡献者列表中找到了我的名字:))我不喜欢我所看到的,然后我继续前进。

从https://news.ycombinator.com/item?id=6089252粘贴我的相关 news.yc 评论:

根据我的经验,ZeroMQ 在类似 RPC 的应用程序中非常脆弱,特别是因为它试图抽象出“连接”。当您进行多播时(ZeroMQ 在进行多播时会很困难),这种心态非常合适,但对于单播,我实际上希望检测到断开连接或连接失败,并在我的传出缓冲区被阻塞之前进行适当的处​​理。因此,在选择 ZeroMQ 作为内部 RPC 类型消息传递的传输之前,我会评估其他替代方案。

如果您愿意在解析(或发送)消息之前将整个消息存储在内存中(在通过网络传输大型文档时,Http 并没有那么糟糕),请将原始 MessagePack 文档写入常规 TCP 流(或将其塞入其中) UDP 数据报)就可以了。MessagePack 库确实支持解析流——请参阅其主页 ( http://msgpack.org ) 中的 Python 示例。

披露:我只是一个快乐的 MessagePack(有时是 ZeroMQ)用户。我在 Spyne ( http://spyne.io ) 上工作,所以我对一些最流行的协议有经验。

我好像一年多前就写过这个评论了。快进到今天,我在 Spyne 2.11 中实现并发布了 MessagePack 传输。因此,如果您正在寻找一种用于内部传递小消息的轻量级传输,我的建议是使用它而不是 ZeroMQ。

然而,一旦你离开了 Http 领域,你就会回到在系统级别处理套接字,这可能是你想要的,也可能不是你想要的,尤其取决于你必须为此位预留的资源量您的项目。

遗憾的是,除了我刚刚放在一起的示例之外,没有关于它的文档: https: //github.com/arskom/spyne/tree/master/examples/msgpack_transport

服务器代码是相当标准的 Spyne/Twisted 代码,但客户端使用系统级套接字来说明它应该如何工作。我很乐意接受将其包装到适当的 Spyne 客户端传输的拉取请求。

我希望这有帮助。欢迎补丁。

此致,