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

时间:2014-08-06 16:02:10

标签: python zeromq msgpack spyne

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

我找到了类spyne.client.zeromq.ZeroMQClient,但我不知道它应该是什么应用程序'应用程序'其构造函数的参数。

提前谢谢!

修改

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

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()

1 个答案:

答案 0 :(得分: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

<强> BUT

所有这些都说,你不应该将ZeroMQ用于RPC。

我看着ZeroMQ用于RPC的目的,当它的宣传达到疯狂的水平时,(我甚至在ZeroMQ贡献者列表中得到了我的名字:))我不喜欢我所看到的,我继续前进。

https://news.ycombinator.com/item?id=6089252点击我的相关news.yc评论:

  

根据我的经验,ZeroMQ在类似RPC的应用程序中非常脆弱,   特别是因为它试图抽象出&#34;连接&#34;。这个   当您进行多播(和ZeroMQ)时,心态非常合适   做多播时的岩石),但对于单播,我其实想要   检测断开连接或连接失败并处理它   在我的外出缓冲器被窒息之前适当地进行。所以,我   在确定ZeroMQ作为运输之前评估其他替代方案   用于内部RPC类型的消息传递。

     

如果您在解析之前将整条消息放入内存中就可以了   (或发送)它(Http在转移时并不是那么糟糕   通过网络上的巨大文件),将原始MessagePack文档写入   一个常规的TCP流(或将其塞入UDP数据报)将完成   诀窍就好了。 MessagePack库支持解析流 -   见例如它的主页(http://msgpack.org)中的Python示例。

     

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

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

然而,一旦你在Http-land之外,你就会回到处理系统级别的套接字,这可能是也可能不是你想要的,特别是取决于资源的数量你必须为这个项目做好准备。

可悲的是,除了我刚刚放在这里的例子之外,没有关于它的文档:https://github.com/arskom/spyne/tree/master/examples/msgpack_transport

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

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

致以最诚挚的问候,