There is an example of Spyne client?
Asked Answered
W

1

6

I'm trying to use spyne (http://spyne.io) in my server with ZeroMQ and MsgPack. I've followed the examples to program the server side, but i can't find any example that helps me to know how to program the client side.

I've found the class spyne.client.zeromq.ZeroMQClient , but I don't know what it's supposed to be the 'app' parameter of its constructor.

Thank you in advance!

Edit:

The (simplified) server-side code:

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()
Wacker answered 6/8, 2014 at 16:2 Comment(2)
Code. Code. Code. Code plus any stacktraces, the input, and the expected and actual outputs.Devinne
Ok. I'll provide the server-side code, but my problem is due to lack of (good) documentation, I'm not suffering bugs.Wacker
A
4

Spyne author here.

There are many issues with the Spyne's client transports.

First and most important being that they require server code to work. And that's because Spyne's wsdl parser is just halfway done, so there's no way to communicate the interface the server exposes to a client.

Once the Wsdl parser is done, Spyne's client transports will be revived as well. They're working just fine though, the tests pass, but they are (slightly) obsolete and, as you noticed, don't have proper docs.

Now back to your question: The app parameter to the client constructor is the same application instance that goes to the server constructor. So if you do this:

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

It will print "Hello I am Seldon!"

Here's the full code I just committed: https://github.com/arskom/spyne/tree/master/examples/zeromq

BUT:

All this said, you should not use ZeroMQ for RPC.

I looked at ZeroMQ for RPC purposes back when its hype was up at crazy levels, (I even got my name in ZeroMQ contributors list :)) I did not like what I saw, and I moved on.

Pasting my relevant news.yc comment from https://news.ycombinator.com/item?id=6089252 here:

In my experience, ZeroMQ is very fragile in RPC-like applications, especially because it tries to abstract away the "connection". This mindset is very appropriate when you're doing multicast (and ZeroMQ rocks when doing multicast), but for unicast, I actually want to detect a disconnection or a connection failure and handle it appropriately before my outgoing buffers are choked to death. So, I'd evaluate other alternatives before settling on ZeroMQ as a transport for internal RPC-type messaging.

If you are fine with having the whole message in memory before parsing (or sending) it (Http is not that bad when it comes to transferring huge documents over the network), writing raw MessagePack document to a regular TCP stream (or tucking it inside a UDP datagram) will do the trick just fine. MessagePack library does support parsing streams -- see e.g. its Python example in its homepage (http://msgpack.org).

Disclosure: I'm just a happy MessagePack (and sometimes ZeroMQ) user. I work on Spyne (http://spyne.io) so I just have experience with some of the most popular protocols out there.

I seem to have written that comment more than a year ago. Fast forward to today, I got the MessagePack transport implemented and released in Spyne 2.11. So if you're looking for a lightweight transport for internally passing small messages, my recommendation would be to use it instead of ZeroMQ.

However, once you're outside the Http-land, you're back to dealing with sockets at the system-level, which may or may not be what you want, depending especially on the amount of resources you have to spare for this bit of your project.

Sadly, there is no documentation about it besides the examples I just put together here: https://github.com/arskom/spyne/tree/master/examples/msgpack_transport

The server code is fairly standard Spyne/Twisted code but the client is using system-level sockets to illustrate how it's supposed to work. I'd happily accept a pull request wrapping it to a proper Spyne client transport.

I hope this helps. Patches are welcome.

Best regards,

Advisory answered 7/8, 2014 at 11:7 Comment(4)
Thank you Burak. It's true that ZeroMQ has many problems (I was using ZeroRPC, and because the same problems you tell in the cite I'm searching an alternative).Wacker
That said, I have one doubt: If in the client side I have to use the 'radiante_rpc' object... that increases the coupling between the server and the client (we are using RPCs to fight coupling :p). How do you deal with this problem?Wacker
Despite what it seems, it doesn't increase coupling. Think of it as a very efficient WSDL document.Advisory
The client is only extracting method signatures from the application. It would still work if the methods themselves had nothing but pass in them.Advisory

© 2022 - 2024 — McMap. All rights reserved.