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)
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 客户端传输的拉取请求。
我希望这有帮助。欢迎补丁。
此致,