6

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

我找到了 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()
4

1 回答 1

3

Spyne作者在这里。

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

首先也是最重要的是它们需要服务器代码才能工作。那是因为 Spyne 的 wsdl 解析器只完成了一半,所以没有办法将服务器暴露给客户端的接口进行通信。

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

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

c = ZeroMQClient("tcp://127.0.0.1:5001", radiante_rpc)
print c.service.whoiam()

它将打印“你好,我是谢顿!”

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

但是

综上所述,您不应该将 ZeroMQ 用于 RPC。

当 ZeroMQ 的炒作达到疯狂的水平时,我出于 RPC 的目的查看了 ZeroMQ,(我什至在 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 客户端传输的拉取请求。

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

此致,

于 2014-08-07T11:07:25.013 回答