Evented applications with RabbitMQ and CakePHP

51
Evented Applications with RabbitMQ , Python, and CakePHP

description

Talk given at CakeFest 2011 about using RabbitMQ, CakePHP and pyhon to create soft realtime applications.

Transcript of Evented applications with RabbitMQ and CakePHP

Page 1: Evented applications with RabbitMQ and CakePHP

Evented Applications

with RabbitMQ , Python, and CakePHP

Page 2: Evented applications with RabbitMQ and CakePHP

What the wibblefish?

All about offloading work, and doing things in ‘realtime’

Make applications that complete tasks in a distributed/scalable fashion.

Doing work outside the request/response cycle of a UI/API.

Page 3: Evented applications with RabbitMQ and CakePHP

Work to offload

Noti"cations (SMS, Email, Postal mail).

Logging.

Import & export.

Process image & video.

Reporting.

Webhooks.

Page 4: Evented applications with RabbitMQ and CakePHP

Isn’t cron good enough?

Cron tabs are great with one server.

Cron doesn’t scale to multiple machines.

Cron doesn’t solve the whole problem space.

Page 5: Evented applications with RabbitMQ and CakePHP

Problems with Cron

Isn’t suitable for ‘real-time’ results.

Requires a set schedule. You might spin up processes that do nothing. Or you might not have enough capacity.

Parallelizing is a pain.

Page 6: Evented applications with RabbitMQ and CakePHP

Queues to the rescue!

Queues accept and dispatch events.

Events can contain almost anything*.

Events can be roughly equal to ‘jobs’.

A single event can trigger lots of downstream work.

Page 7: Evented applications with RabbitMQ and CakePHP

Architectural benefits

Separation of concerns.

Collection of mini/small applications.

No monolithic applications.

Decoupled, and easier to test.

Easy to scale. Busy service = more of them.

Page 8: Evented applications with RabbitMQ and CakePHP

Queue technologies

RabbitMQ

ZeroMQ

SQS

Celery

Gearman

Page 9: Evented applications with RabbitMQ and CakePHP

RabbitMQ

Written in Erlang.

Open source and Free.

Really Fast.

Socket protocol that is has cheap connections.

Data persists after a crash.

Page 10: Evented applications with RabbitMQ and CakePHP

Queue basics

Producers create events.

Consumers eat messages, and do work.

messages == events.

Page 11: Evented applications with RabbitMQ and CakePHP

Queue Basics

Producer

Page 12: Evented applications with RabbitMQ and CakePHP

Queue Basics

Producer

Page 13: Evented applications with RabbitMQ and CakePHP

Queue Basics

Producer Consumer

Page 14: Evented applications with RabbitMQ and CakePHP

Queue Basics

Producer

Consumer

Consumer

Page 15: Evented applications with RabbitMQ and CakePHP

Queue Basics

Producer

Consumer

Consumer

Consumer

Page 16: Evented applications with RabbitMQ and CakePHP

Exchanges

Exchanges abstract queues from the producer.

Route messages to queues, that are bound by routing keys.

Allows consumers to listen to speci"c routing keys.

Multiple consumers can listen to the same events.

Page 17: Evented applications with RabbitMQ and CakePHP

Exchanges

Producer

Page 18: Evented applications with RabbitMQ and CakePHP

Exchanges

Producer

Page 19: Evented applications with RabbitMQ and CakePHP

Exchanges

Producer

Consumer

page_view

Page 20: Evented applications with RabbitMQ and CakePHP

Exchanges

ProducerConsumerimport

Consumer

page_view

Page 21: Evented applications with RabbitMQ and CakePHP

Exchanges

Producer

Consumererror,

page_view

Consumerimport

Consumer

page_view

Page 22: Evented applications with RabbitMQ and CakePHP

Topic subscription

Consumers can also listen to topics. Which are keys separated by dots.

e.g page_view.search, page_view.update

Consumer could listen to page_view.*

Page 23: Evented applications with RabbitMQ and CakePHP

Producing

Can create messages with many tools.

PHP, python, node, ruby, etc.

Messages can contain any stringy data (JSON)

Page 24: Evented applications with RabbitMQ and CakePHP

Data for messages

Only string-y things can be stored in messages.

JSON encoded data in message.

Key to value stored in Redis/Memcache.

Keep messages small. RabbitMQ performs better with small messages.

Page 25: Evented applications with RabbitMQ and CakePHP

Consuming

Use a daemon process.

Daemons in PHP can be done, but they kinda suck.

Usually use sleep(2) or other workaround.

sleep(2) moves you away from ‘real time’.

Page 26: Evented applications with RabbitMQ and CakePHP

Aw bugger..

Page 27: Evented applications with RabbitMQ and CakePHP

Use a better tool

Other tools are much better for making daemons.

Python (pika, kombu, sparkplug)

NodeJS (node-amqp)

Ruby (carrot, ruby-amqp)

Page 28: Evented applications with RabbitMQ and CakePHP

Managing mixed applications

Many ways to get it done.

Avoid duplicating code.

Thin daemons + worker processes.

Page 29: Evented applications with RabbitMQ and CakePHP

Thin daemons

Python/node daemon accepts messages.

Delegate to PHP worker processes.

Keeps PHP’s fork + die work#ow.

Re-use application code by calling shells.

Page 30: Evented applications with RabbitMQ and CakePHP

Thin daemons

PHP

Page 31: Evented applications with RabbitMQ and CakePHP

Thin daemons

PHP

Page 32: Evented applications with RabbitMQ and CakePHP

Thin daemons

PHP

Py

Page 33: Evented applications with RabbitMQ and CakePHP

Thin daemons

PHP Py

Py

Page 34: Evented applications with RabbitMQ and CakePHP

Thin daemons

PHP Py

Py

Py

Page 35: Evented applications with RabbitMQ and CakePHP

Thin daemons

PHP Py

Py

Py PHP

Page 36: Evented applications with RabbitMQ and CakePHP

Thin daemons

PHP Py PHP

Py

Py PHP

Page 37: Evented applications with RabbitMQ and CakePHP

Thin daemons

PHP Py PHP

Py PHP

Py PHP

Page 38: Evented applications with RabbitMQ and CakePHP

Demo Time

Page 39: Evented applications with RabbitMQ and CakePHP

Overview

Use CakeLog to "re events.

Use CakePHP shell’s for actual work.

Thin python daemon for processing messages.

Page 40: Evented applications with RabbitMQ and CakePHP

Python + sparkplug

Python module for creating queue listeners.

Created by a developer at FreshBooks.

Ini con"guration "le de"nes behaviour.

Page 41: Evented applications with RabbitMQ and CakePHP

What we’ll try:

User events logged during application.

Log events to the database.

Page 42: Evented applications with RabbitMQ and CakePHP

Insert code

Page 43: Evented applications with RabbitMQ and CakePHP

Limitations of using shells

Daemon and shell processes have to be on the same box.

This can be limiting as you scale, depends on how you structure applications.

Page 44: Evented applications with RabbitMQ and CakePHP

Solutions

Use HTTP.

Have thin daemons dispatch back to the front-end application using HTTP.

Use Basic/Digest authentication.

Use checksums.

Page 45: Evented applications with RabbitMQ and CakePHP

HTTP daemons

PHP

Page 46: Evented applications with RabbitMQ and CakePHP

HTTP daemons

PHP

Page 47: Evented applications with RabbitMQ and CakePHP

HTTP daemons

PHP Py

Page 48: Evented applications with RabbitMQ and CakePHP

HTTP daemons

PHP Py

Web

Page 49: Evented applications with RabbitMQ and CakePHP

HTTP daemons

PHP Py Web

Web

Page 50: Evented applications with RabbitMQ and CakePHP

HTTP daemons

PHP Py Web

Web

Web

Page 51: Evented applications with RabbitMQ and CakePHP

Thanks; Questions?