Zeromq - Pycon India 2013

Post on 01-Sep-2014

3.081 views 4 download

Tags:

description

 

Transcript of Zeromq - Pycon India 2013

Build your next project - Super fast,

distributed and infinitely scalable.

Using ZeroMQ

Web Framework Tutorial

Application

Client (Browser)

Real World

Queues• Apache ActiveMQ• RabbitMQ• StormMQ• Redis…

ZeroMQ

0MQ

ØMQ

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

Request - Reply

Hello World Serverimport 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")

Hello World Clientimport zmq

context = zmq.Context()

# Socket to talk to serverprint "Connecting to hello world server..."socket = context.socket(zmq.REQ)socket.connect ("tcp://localhost:5555")

# Do 10 requests, waiting each time for a responsefor req_no in range (10): socket.send ("Hello")

# Get the reply. message = socket.recv() print "Received reply ", req_no, "[", message, "]"

Hello World Client 2import sysimport timeimport 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]))

Publish - Subscribe

Stock Ticker Serverimport zmqimport timeimport 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)

Stock Ticker Clientimport sysimport 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)

Parallel Pipeline

import antigravity

XKCD Task Ventilatorimport sysimport 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)

XKCD Task Workerimport jsonimport zmq

import requestsfrom 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

XKCD Task Workercontext = zmq.Context()

# Socket to receive messages onreceiver = context.socket(zmq.PULL)receiver.connect("tcp://localhost:5557")

# Socket to send messages tosender = context.socket(zmq.PUSH)sender.connect("tcp://localhost:5558")

# Process tasks foreverwhile 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}))

XKCD Sinkimport zmq

context = zmq.Context()

# Socket to receive messages onreceiver = context.socket(zmq.PULL)receiver.bind("tcp://*:5558")

while True: s = receiver.recv() print s

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

epgm://interface:address:port

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

http://zero.mq/

http://zguide.zeromq.org/py:all

https://github.com/cnu/zeromq-talk

Links