37
Queue Everything & Please Everyone * * * Vaidik Kapoor

Queue Everything and Please Everyone

Embed Size (px)

DESCRIPTION

My presentation at PyCon India 2012 on Queues in Web Applications.

Citation preview

Page 1: Queue Everything and Please Everyone

Queue Everything&

Please Everyone

* * *

Vaidik Kapoor

Page 2: Queue Everything and Please Everyone

Who am I?

➔ Undergraduate student.➔ Involved with:

✔ Mozilla as a Contributor and Rep✔ Drupal as a Contributor

➔ Twitter: @vaidikkapoor➔ Github: vaidikkp➔ Web: vaidikkapoor.info

Page 3: Queue Everything and Please Everyone

Web Applications

Page 4: Queue Everything and Please Everyone

Responsiveness

Page 5: Queue Everything and Please Everyone

Why do everything at once?

Task 1 Task 2 Task 3 Task N

ClientRequest Response

Page 6: Queue Everything and Please Everyone

Break the Request-Response Cycle

Task 1

Task 2

Task 3

Task N

ClientRequest Response

Page 7: Queue Everything and Please Everyone

Meet Queues

Page 8: Queue Everything and Please Everyone

What can Queues help with?

➔ Background Processing✔ Data Processing✔ Media Processing✔ Updating Caches

➔ Anything that you want to offload off your server.

➔ Improve the overall User Experience

Page 9: Queue Everything and Please Everyone

Redis+

HotQueue / PyRes

Page 10: Queue Everything and Please Everyone

Redis + HotQueue

PRODUCER:

from hotqueue import HotQueuequeue = HotQueue("myqueue", host="localhost", port=6379, db=0)

queue.put(message)

CONSUMER / WORKER:

from hotqueue import HotQueuequeue = HotQueue("myqueue", host="localhost", port=6379, db=0)

while True: message = queue.get() # do something awesome

Page 11: Queue Everything and Please Everyone

Redis + PyRes

➔ Python clone of Github's Resque➔ Offers a lot more features than HotQueue

✔ Job failure handling✔ Queue status information

➔ Comes with Monitoring System written in Ruby

Page 12: Queue Everything and Please Everyone

Redis + PyRes

PRODUCER:

from pyres import ResQr = Resq()

class WebPage: queue = “screenies”

@staticmethod def perform(urll): # save the screenshot

r.enqueue(WebPage, 'http://python.org')

CONSUMER:

./pyres_worker screenies

Page 13: Queue Everything and Please Everyone

Message Queue

A system for enabling asynchronous processing of discrete tasks.

Page 14: Queue Everything and Please Everyone

What can MQs help with?

➔ Everything that generic Queues can help with.➔ Increase Reliability➔ Cron Jobs (Celery)

Page 15: Queue Everything and Please Everyone

Available MQ Solutions

➔ RabbitMQ➔ Amazon Simple Queue➔ Apache MQ➔ Gearman➔ Starling➔ OpenAMQ➔ Sun Java Message Queue System

Page 16: Queue Everything and Please Everyone

Message Queue Protocols

➔ AMQP: Advanced Message Queue Protocol➔ JMS: Java Messaging Service➔ STOMP: Streaming Text Oriented Messaging

Protocol

Page 17: Queue Everything and Please Everyone

Criteria for Broker Selection

➔ Difficulty in Recovery➔ Relatively low level of required maintenance➔ Ease of Deployment➔ Durability➔ Persistence➔ Community Support➔ Cluster Support➔ What language is it written in?

Page 18: Queue Everything and Please Everyone

RabbitMQ

➔ A Message Broker➔ Implements AMQP

Page 19: Queue Everything and Please Everyone

Pika & Other AMQP Libraries

Page 20: Queue Everything and Please Everyone

Celery

➔ An amazing Task Manager➔ Batteries Included➔ Uses RabbitMQ as broker (or almost anything)➔ Libraries for most of the common web frameworks

like Django, Flask, Pyramid➔ Supports multiprocessing.➔ Distribute tasks easily.➔ Makes life easy

Page 21: Queue Everything and Please Everyone

Celery Example

from celery.task import task

@task():def take_screenshot(url): # magical code to take screenshot comes here

Page 22: Queue Everything and Please Everyone

How to put it all together?

Page 23: Queue Everything and Please Everyone

Web App BrokerTask

Manager

WorkerServer (s)Database

The General Setup

Page 24: Queue Everything and Please Everyone

Then what?

Page 25: Queue Everything and Please Everyone

Notify Your Users

Page 26: Queue Everything and Please Everyone

Django's Messaging System

Page 27: Queue Everything and Please Everyone

Flask's Flashes

Page 28: Queue Everything and Please Everyone

Poll using AJAX

Page 29: Queue Everything and Please Everyone

WebSockets

Page 30: Queue Everything and Please Everyone

Email

Page 31: Queue Everything and Please Everyone

Things to Remember

Page 32: Queue Everything and Please Everyone

Isolate

Isolate code, make reusable components.

Page 33: Queue Everything and Please Everyone

Recycle

Remove Request Dependency

Page 34: Queue Everything and Please Everyone

Unit Testing?

Page 35: Queue Everything and Please Everyone

Review

➔ Choose a system according to needs➔ Build a robust system➔ Integrate seamlessly with your UI➔ Isolate & Recycle: make it a habit➔ Improve the overall UX!➔ Please everyone, even yourself!

Page 36: Queue Everything and Please Everyone

References

➔ PyRes - http://pyres.readthedocs.org/

➔ RabbitMQ - http://www.rabbitmq.com/

➔ Celery - http://celeryproject.org/

➔ Amazing Article - http://wiki.secondlife.com/wiki/Message_Queue_Evaluation_Notes

Page 37: Queue Everything and Please Everyone

Thank You!