Slide 1

Slide 1 text

Build  your  next  project  -­‐‑   Super  fast,  distributed   and  infinitely  scalable.   Using  ZeroMQ

Slide 2

Slide 2 text

Web  Framework  Tutorial Application Client     (Browser)

Slide 3

Slide 3 text

Real  World

Slide 4

Slide 4 text

Queues •  Apache ActiveMQ •  RabbitMQ •  StormMQ •  Redis …

Slide 5

Slide 5 text

ZeroMQ 0MQ ØMQ

Slide 6

Slide 6 text

Basic  PaNerns •  Request/Reply •  Publish/Subscribe •  Pipelining •  Paired Sockets

Slide 7

Slide 7 text

Request  -­‐‑  Reply

Slide 8

Slide 8 text

Hello  World  Server import  zmq     context  =  zmq.Context()     print  "Starting  hello  world  server..."   socket  =  context.socket(zmq.REP)   socket.bind("tcp://*:5555")     while  True:          message  =  socket.recv()          print  "Got:  ",  message            #    Send  the  reply.          socket.send  ("World")  

Slide 9

Slide 9 text

Hello  World  Client import  zmq     context  =  zmq.Context()     #    Socket  to  talk  to  server   print  "Connecting  to  hello  world  server..."   socket  =  context.socket(zmq.REQ)   socket.connect  ("tcp://localhost:5555")     #    Do  10  requests,  waiting  each  time  for  a  response   for  req_no  in  range  (10):          socket.send  ("Hello")            #    Get  the  reply.          message  =  socket.recv()          print  "Received  reply  ",  req_no,  "[",  message,  "]"  

Slide 10

Slide 10 text

Hello  World  Client  2 import  sys   import  time   import  zmq     context  =  zmq.Context()   print  "Connecting  to  hello  world  server..."   socket  =  context.socket(zmq.REQ)   socket.connect  ("tcp://localhost:5555")     while  True:          socket.send(sys.argv[2])            #    Get  the  reply.          message  =  socket.recv()          print  "Received  reply  ",  "[",  message,  "]"            time.sleep(float(sys.argv[1]))  

Slide 11

Slide 11 text

Publish  -­‐‑  Subscribe

Slide 12

Slide 12 text

Stock  Ticker  Server import  zmq   import  time   import  random     context  =  zmq.Context()   socket  =  context.socket(zmq.PUB)   socket.bind("tcp://*:5556")   scrips  =  ['AAPL',  'GOOG',  'MSFT',  'AMZN']     while  True:          scrip  =  random.choice(scrips)          price  =  random.randrange(20,700)                    msg  =  "%s:  %d"  %  (scrip,  price)          print  msg          socket.send(msg)          time.sleep(0.5)  

Slide 13

Slide 13 text

Stock  Ticker  Client import  sys   import  zmq     context  =  zmq.Context()   socket  =  context.socket(zmq.SUB)     print  "Collecting  updates  from  stock  server..."   socket.connect  ("tcp://localhost:5556”)     scrip_filter  =  sys.argv[1:]  if  len(sys.argv)  >  1  else  ["AAPL"]   for  scrip  in  scrip_filter:          socket.setsockopt(zmq.SUBSCRIBE,  scrip)     while  True:          string  =  socket.recv()          stock,  price  =  string.split()          print  "%s:  %s"  %(stock,  price)  

Slide 14

Slide 14 text

Parallel  Pipeline

Slide 15

Slide 15 text

import  antigravity

Slide 16

Slide 16 text

XKCD  Task  Ventilator import  sys   import  zmq     context  =  zmq.Context()     sender  =  context.socket(zmq.PUSH)   sender.bind("tcp://*:5557")     print  "Press  Enter  when  the  workers  are  ready:  "   _  =  raw_input()   print  "Sending  tasks  to  workers..."     base_url  =  'http://xkcd.com/'   urls  =  [base_url  +  str(i)  for  i  in  xrange(1,  int(sys.argv[1]))]     for  url  in  urls:          sender.send(url)  

Slide 17

Slide 17 text

XKCD  Task  Worker import  json   import  zmq     import  requests   from  lxml  import  etree     def  get_title(url):          """Given  a  XKCD  url,  retrieve  the  title  of  the  image."""          r  =  requests.get(url)          tree  =  etree.HTML(r.content)          title  =  tree.xpath('//div[@id="comic"]/img/@title')          if  title:                  return  title[0]          else:                  return  None  

Slide 18

Slide 18 text

XKCD  Task  Worker context  =  zmq.Context()     #  Socket  to  receive  messages  on   receiver  =  context.socket(zmq.PULL)   receiver.connect("tcp://localhost:5557")     #  Socket  to  send  messages  to   sender  =  context.socket(zmq.PUSH)   sender.connect("tcp://localhost:5558")     #  Process  tasks  forever   while  True:          s  =  receiver.recv()          title  =  get_title(s)          print  s,  title            #  Send  a  JSON  payload  to  sink          sender.send(json.dumps({"url":s,  "title":title}))  

Slide 19

Slide 19 text

XKCD  Sink import  zmq     context  =  zmq.Context()     #  Socket  to  receive  messages  on   receiver  =  context.socket(zmq.PULL)   receiver.bind("tcp://*:5558")     while  True:          s  =  receiver.recv()          print  s  

Slide 20

Slide 20 text

Transport  Types •  inproc://name •  ipc:///tmp/filename •  tcp://hostname:port •  pgm://interface:address:port & epgm:// interface:address:port

Slide 21

Slide 21 text

Languages •  C/C++ •  C# •  Java •  Erlang •  Go •  Ruby •  Node.js •  Objective-C …

Slide 22

Slide 22 text

hNp://zero.mq/ hNp://zguide.zeromq.org/py:all hNps://github.com/cnu/zeromq-­‐‑talk Links