117
Scaling Web Apps With RabbitMQ Álvaro Videla | The NetCircle Erlang Factory Lite 2010

Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Embed Size (px)

DESCRIPTION

Talk given at the Erlang Factory Lite - 2010 in Los Angeles.

Citation preview

Page 1: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Scaling Web AppsWith RabbitMQ

Álvaro Videla | The NetCircle

Erlang Factory Lite 2010

Page 2: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Who?

Page 3: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

About Me

• Development Manager at TheNetCircle.com

• Writing “RabbitMQ in Action” for Manning

• Blog: http://videlalvaro.github.com/

• Twitter: @old_sound

Page 4: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Why Do I need RabbitMQ?

Page 5: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

The User

Page 6: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

I don’t want to waittill your app resizes

my image!

Page 7: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

The Product Owner

Page 8: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Can we also notify the user friends when she uploads a new image?

Page 9: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Can we also notify the user friends when she uploads a new image?

I forgot to mention we need it for tomorrow…

Page 10: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

The Sysadmin

Page 11: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

Page 12: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

We need this fixed for yesterday!

Page 13: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

The Developer in the other team

Page 14: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

I need to call your PHP stuff but from Python

Page 15: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

I need to call your PHP stuff but from Python

And also Java starting next week

Page 16: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

You

Page 17: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

FML!

Page 18: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Is there a solution?

Page 19: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

RabbitMQ & AMQP

Page 20: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

AMQP

Page 21: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

AMQP

• Advanced Message Queuing Protocol

• Suits Interoperability

• Completely Open Protocol

• Binary Protocol

• AMQP Model

• AMQP Wire Format

Page 22: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

AMQP Model

• Exchanges

• Message Queues

• Bindings

• Rules for binding them

Page 23: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

AMQP Wire Protocol

• Functional Layer

• Transport Layer

Page 25: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Exchange Types

• Fanout

• Direct

• Topic

Page 29: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Usage Scenarios

Page 30: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Usage Scenarios

• Batch Processing

Page 31: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Usage Scenarios

• Batch Processing

• Image Uploading

Page 32: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Usage Scenarios

• Batch Processing

• Image Uploading

• Distributed Logging

Page 33: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Scenario

Batch Processing

Page 34: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

Page 35: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Generate XML

Page 36: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Generate XML

• Distribution Over a Cluster

Page 37: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Generate XML

• Distribution Over a Cluster

• Elasticity - Add/Remove new workers

Page 38: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Generate XML

• Distribution Over a Cluster

• Elasticity - Add/Remove new workers

• No Code Changes

Page 39: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Design

Page 40: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$msg = new AMQPMessage($video_info, array('content_type' => 'text/plain',

'delivery_mode' => 2));

$channel->basic_publish($msg, 'video-desc-ex');

$channel->close();$conn->close();

Page 41: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$msg = new AMQPMessage($video_info, array('content_type' => 'text/plain',

'delivery_mode' => 2));

$channel->basic_publish($msg, 'video-desc-ex');

$channel->close();$conn->close();

Page 42: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$msg = new AMQPMessage($video_info, array('content_type' => 'text/plain',

'delivery_mode' => 2));

$channel->basic_publish($msg, 'video-desc-ex');

$channel->close();$conn->close();

Page 43: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$msg = new AMQPMessage($video_info, array('content_type' => 'text/plain',

'delivery_mode' => 2));

$channel->basic_publish($msg, 'video-desc-ex');

$channel->close();$conn->close();

Page 44: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$msg = new AMQPMessage($video_info, array('content_type' => 'text/plain',

'delivery_mode' => 2));

$channel->basic_publish($msg, 'video-desc-ex');

$channel->close();$conn->close();

Page 45: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$msg = new AMQPMessage($video_info, array('content_type' => 'text/plain',

'delivery_mode' => 2));

$channel->basic_publish($msg, 'video-desc-ex');

$channel->close();$conn->close();

Page 46: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$channel->queue_declare('video-desc-queue', false, true, false, false);

$channel->queue_bind('video-desc-queue', 'video-desc-ex');

$channel->basic_consume('video-desc-queue', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) { $channel->wait();}

Page 47: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$channel->queue_declare('video-desc-queue', false, true, false, false);

$channel->queue_bind('video-desc-queue', 'video-desc-ex');

$channel->basic_consume('video-desc-queue', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) { $channel->wait();}

Page 48: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$channel->queue_declare('video-desc-queue', false, true, false, false);

$channel->queue_bind('video-desc-queue', 'video-desc-ex');

$channel->basic_consume('video-desc-queue', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) { $channel->wait();}

Page 49: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$channel->queue_declare('video-desc-queue', false, true, false, false);

$channel->queue_bind('video-desc-queue', 'video-desc-ex');

$channel->basic_consume('video-desc-queue', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) { $channel->wait();}

Page 50: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$channel->queue_declare('video-desc-queue', false, true, false, false);

$channel->queue_bind('video-desc-queue', 'video-desc-ex');

$channel->basic_consume('video-desc-queue', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) { $channel->wait();}

Page 51: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$channel->queue_declare('video-desc-queue', false, true, false, false);

$channel->queue_bind('video-desc-queue', 'video-desc-ex');

$channel->basic_consume('video-desc-queue', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) { $channel->wait();}

Page 52: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$conn = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);$channel = $conn->channel();

$channel->exchange_declare('video-desc-ex', 'direct', false, true, false);

$channel->queue_declare('video-desc-queue', false, true, false, false);

$channel->queue_bind('video-desc-queue', 'video-desc-ex');

$channel->basic_consume('video-desc-queue', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) { $channel->wait();}

Page 53: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Scenario

Upload Pictures

Page 54: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

Page 55: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Upload Picture

Page 56: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Upload Picture

• Reward User

Page 57: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Upload Picture

• Reward User

• Notify User Friends

Page 58: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Upload Picture

• Reward User

• Notify User Friends

• Resize Picture

Page 59: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Upload Picture

• Reward User

• Notify User Friends

• Resize Picture

• No Code Changes

Page 60: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Design

Page 61: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Design

Page 62: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Design

Page 63: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code$channel->exchange_declare('upload-pictures', 'fanout', false, true, false);

$metadata = json_encode(array('image_id' => $image_id,'user_id' => $user_id,‘image_path' => $image_path));

$msg = new AMQPMessage($metadata, array('content_type' => 'application/json', 'delivery_mode' => 2));

$channel->basic_publish($msg, 'upload-pictures');

Page 64: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code$channel->exchange_declare('upload-pictures', 'fanout', false, true, false);

$metadata = json_encode(array('image_id' => $image_id,'user_id' => $user_id,‘image_path' => $image_path));

$msg = new AMQPMessage($metadata, array('content_type' => 'application/json', 'delivery_mode' => 2));

$channel->basic_publish($msg, 'upload-pictures');

Page 65: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code$channel->exchange_declare('upload-pictures', 'fanout', false, true, false);

$metadata = json_encode(array('image_id' => $image_id,'user_id' => $user_id,‘image_path' => $image_path));

$msg = new AMQPMessage($metadata, array('content_type' => 'application/json', 'delivery_mode' => 2));

$channel->basic_publish($msg, 'upload-pictures');

Page 66: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code$channel->exchange_declare('upload-pictures', 'fanout', false, true, false);

$metadata = json_encode(array('image_id' => $image_id,'user_id' => $user_id,‘image_path' => $image_path));

$msg = new AMQPMessage($metadata, array('content_type' => 'application/json', 'delivery_mode' => 2));

$channel->basic_publish($msg, 'upload-pictures');

Page 67: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code$channel->exchange_declare('upload-pictures', 'fanout', false, true, false);

$metadata = json_encode(array('image_id' => $image_id,'user_id' => $user_id,‘image_path' => $image_path));

$msg = new AMQPMessage($metadata, array('content_type' => 'application/json', 'delivery_mode' => 2));

$channel->basic_publish($msg, 'upload-pictures');

Page 68: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code$channel->exchange_declare('upload-pictures', 'fanout',

false, true, false);

$channel->queue_declare('resize-picture', false, true, false, false);

$channel->queue_bind('resize-picture', 'upload-pictures');

$channel->basic_consume('resize-picture', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) {$channel->wait();

}

Page 69: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code$channel->exchange_declare('upload-pictures', 'fanout',

false, true, false);

$channel->queue_declare('resize-picture', false, true, false, false);

$channel->queue_bind('resize-picture', 'upload-pictures');

$channel->basic_consume('resize-picture', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) {$channel->wait();

}

Page 70: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code$channel->exchange_declare('upload-pictures', 'fanout',

false, true, false);

$channel->queue_declare('resize-picture', false, true, false, false);

$channel->queue_bind('resize-picture', 'upload-pictures');

$channel->basic_consume('resize-picture', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) {$channel->wait();

}

Page 71: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code$channel->exchange_declare('upload-pictures', 'fanout',

false, true, false);

$channel->queue_declare('resize-picture', false, true, false, false);

$channel->queue_bind('resize-picture', 'upload-pictures');

$channel->basic_consume('resize-picture', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) {$channel->wait();

}

Page 72: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code$channel->exchange_declare('upload-pictures', 'fanout',

false, true, false);

$channel->queue_declare('resize-picture', false, true, false, false);

$channel->queue_bind('resize-picture', 'upload-pictures');

$channel->basic_consume('resize-picture', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) {$channel->wait();

}

Page 73: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code$channel->exchange_declare('upload-pictures', 'fanout',

false, true, false);

$channel->queue_declare('resize-picture', false, true, false, false);

$channel->queue_bind('resize-picture', 'upload-pictures');

$channel->basic_consume('resize-picture', $consumer_tag, false, false, false, false, $consumer);

while(count($channel->callbacks)) {$channel->wait();

}

Page 74: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$consumer = function($msg){

$meta = json_decode($msg->body, true);

resize_picture($meta['image_id'], $meta['image_path']);

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);

};

Page 75: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$consumer = function($msg){

$meta = json_decode($msg->body, true);

resize_picture($meta['image_id'], $meta['image_path']);

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);

};

Page 76: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$consumer = function($msg){

$meta = json_decode($msg->body, true);

resize_picture($meta['image_id'], $meta['image_path']);

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);

};

Page 77: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$consumer = function($msg){

$meta = json_decode($msg->body, true);

resize_picture($meta['image_id'], $meta['image_path']);

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);

};

Page 78: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$consumer = function($msg){

$meta = json_decode($msg->body, true);

resize_picture($meta['image_id'], $meta['image_path']);

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);

};

Page 79: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Scenario

Distributed Logging

Page 80: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

Page 81: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Several Web Servers

Page 82: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Several Web Servers

• Logic Separated by Module/Action

Page 83: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Several Web Servers

• Logic Separated by Module/Action

• Several Log Levels:

Page 84: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Several Web Servers

• Logic Separated by Module/Action

• Several Log Levels:

• Info, Warning, Error

Page 85: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Requirements

• Several Web Servers

• Logic Separated by Module/Action

• Several Log Levels:

• Info, Warning, Error

• Add/Remove log listeners at will

Page 86: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Design

Page 87: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Design

Page 88: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Design

Page 89: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Design

Page 90: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Design

Page 91: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$msg = new AMQPMessage('some log message',array('content_type' => 'text/plain'));

$channel->basic_publish($msg, 'logs', 'server1.user.profile.info');

Page 92: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$msg = new AMQPMessage('some log message',array('content_type' => 'text/plain'));

$channel->basic_publish($msg, 'logs', server1.user.profile.info');

Page 93: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$msg = new AMQPMessage('some log message',array('content_type' => 'text/plain'));

$channel->basic_publish($msg, 'logs', server1.user.profile.info');

Page 94: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Publisher Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$msg = new AMQPMessage('some log message',array('content_type' => 'text/plain'));

$channel->basic_publish($msg, 'logs', server1.user.profile.info');

Page 95: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

Get messages sent by host:

server1

Page 96: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$channel->queue_declare('server1-logs', false, true, false, false);

$channel->queue_bind('server1-logs', 'logs', 'server1.#');

Page 97: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$channel->queue_declare('server1-logs', false, true, false, false);

$channel->queue_bind('server1-logs', 'logs', 'server1.#');

Page 98: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$channel->queue_declare('server1-logs', false, true, false, false);

$channel->queue_bind('server1-logs', 'logs', 'server1.#');

Page 99: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$channel->queue_declare('server1-logs', false, true, false, false);

$channel->queue_bind('server1-logs', 'logs', 'server1.#');

Page 100: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

Get all error messages

Page 101: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$channel->queue_declare('error-logs', false, true, false, false);

$channel->queue_bind('error-logs', 'logs', '#.error');

Page 102: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$channel->queue_declare('error-logs', false, true, false, false);

$channel->queue_bind('error-logs', 'logs', '#.error');

Page 103: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$channel->queue_declare('error-logs', false, true, false, false);

$channel->queue_bind('error-logs', 'logs', '#.error');

Page 104: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Consumer Code

$channel->exchange_declare('logs', 'topic', false, true, false);

$channel->queue_declare('error-logs', false, true, false, false);

$channel->queue_bind('error-logs', 'logs', '#.error');

Page 105: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Why RabbitMQ?

Page 106: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

RabbitMQ

• Enterprise Messaging System

• Open Source MPL

• Written in Erlang/OTP

• Commercial Support

Page 107: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Features

• Reliable and High Scalable

• Easy To install

• Easy To Cluster

• Runs on: Windows, Solaris, Linux, OSX

• AMQP 0.8 - 0.9.1

Page 108: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Client Libraries

• Java

• .NET/C#

• Erlang

• Ruby, Python, PHP, Perl, AS3, Lisp, Scala, Clojure, Haskell

Page 109: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Docs/Support

• http://www.rabbitmq.com/documentation.html

• http://dev.rabbitmq.com/wiki/

• #rabbitmq at irc.freenode.net

• http://www.rabbitmq.com/email-archive.html

Page 110: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

One Setup for HA

Page 111: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Conclusion

Page 112: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Conclusion

• Flexibility

Page 113: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Conclusion

• Flexibility

• Scalability

Page 114: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Conclusion

• Flexibility

• Scalability

• Interoperability

Page 115: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Conclusion

• Flexibility

• Scalability

• Interoperability

• Reduce Ops

Page 116: Scaling Web Apps With RabbitMQ - Erlang Factory Lite

Questions?