nanomsg:
simple
smart
sockets
dirkjan.ochtman.nl
by flickr:ter-burg
TCP/IP
message queues
ØMQ
A little history
pipe: stream of data
queue abstraction
WebSphere -> AMQP
Martin Sústrik had an idea:
a message queue toolkit with sockets API
(ØMQ versus nanomsg)
Patterns & Features
import nnpy p1 = nnpy.Socket(nnpy.AF_SP, nnpy.PAIR) p1.bind('inproc://pair') p2 = nnpy.Socket(nnpy.AF_SP, nnpy.PAIR) p2.connect('inproc://pair') p1.send('hello, p2') p1.send('I am p1') print p2.recv() p2.send('nice to meet you') print p1.recv() print p2.recv()
hello, p2 nice to meet you I am p1
diff --git a/pair.py b/pair.py --- a/pair.py +++ b/pair.py @@ -1,10 +1,10 @@ import nnpy p1 = nnpy.Socket(nnpy.AF_SP, nnpy.PAIR) -p1.bind('inproc://pair') +p1.bind('ipc:///tmp/pair') p2 = nnpy.Socket(nnpy.AF_SP, nnpy.PAIR) -p2.connect('inproc://pair') +p2.connect('ipc:///tmp/pair') p1.send('hello, p2') p1.send('I am p1')
import nnpy p1 = nnpy.Socket(nnpy.AF_SP, nnpy.PAIR) p1.bind('ipc:///tmp/pair') p1.send('hello, p2') p1.send('I am p1') print p1.recv()
import nnpy p2 = nnpy.Socket(nnpy.AF_SP, nnpy.PAIR) p2.connect('ipc:///tmp/pair') print p2.recv() p2.send('nice to meet you') print p2.recv()
nice to meet you
hello, p2 I am p1
diff --git a/pair.py b/pair.py --- a/pair.py +++ b/pair.py @@ -1,10 +1,10 @@ import nnpy p1 = nnpy.Socket(nnpy.AF_SP, nnpy.PAIR) -p1.bind('inproc://pair') +p1.bind('tcp://localhost:18913') p2 = nnpy.Socket(nnpy.AF_SP, nnpy.PAIR) -p2.connect('inproc://pair') +p2.connect('tcp://localhost:18913') p1.send('hello, p2') p1.send('I am p1')
import nnpy rep = nnpy.Socket(nnpy.AF_SP, nnpy.REP) rep.bind('inproc://foo') req = nnpy.Socket(nnpy.AF_SP, nnpy.REQ) req.connect('inproc://foo') req.send('test!') print rep.recv() rep.send('echo!') print req.recv()
test! echo!
diff --git a/req-rep.py b/req-rep.py --- a/req-rep.py +++ b/req-rep.py @@ -1,10 +1,10 @@ import nnpy rep = nnpy.Socket(nnpy.AF_SP, nnpy.REP) -rep.bind('inproc://foo') +rep.connect('inproc://foo') req = nnpy.Socket(nnpy.AF_SP, nnpy.REQ) -req.connect('inproc://foo') +req.bind('inproc://foo') req.send('test!') print rep.recv()
import nnpy class Server: def __init__(self, core): self.core = core def run(self): sock = nnpy.Socket(nnpy.AF_SP, nnpy.REP) sock.bind(COMMAND_SERVER) while True: msg = sock.recv() # handle command sock.send(rsp) class Client: def __init__(self, addr): self.sock = nnpy.Socket(nnpy.AF_SP, nnpy.REQ) self.sock.connect(addr) def _send(self, msg): self.sock.send(msg) return self.sock.recv()
import nnpy pub = nnpy.Socket(nnpy.AF_SP, nnpy.PUB) pub.bind('inproc://foo') sub1 = nnpy.Socket(nnpy.AF_SP, nnpy.SUB) sub1.connect('inproc://foo') sub1.setsockopt(nnpy.SUB, nnpy.SUB_SUBSCRIBE, '') sub2 = nnpy.Socket(nnpy.AF_SP, nnpy.SUB) sub2.connect('inproc://foo') sub2.setsockopt(nnpy.SUB, nnpy.SUB_SUBSCRIBE, 'w') pub.send('hello,') pub.send('world') print sub1.recv() print sub2.recv() print sub1.recv()
60μs
wrapping up
Questions?