scaling websites with rabbitmq a(rlvaro videla)

117
Scaling Web Apps With RabbitMQ Álvaro Videla | Liip AG HighLoad ++ 2011 Thursday, September 29, 2011

Upload: ontico

Post on 11-May-2015

1.525 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Scaling websites with RabbitMQ   A(rlvaro Videla)

Scaling Web AppsWith RabbitMQ

Álvaro Videla | Liip AG

HighLoad ++ 2011

Thursday, September 29, 2011

Page 2: Scaling websites with RabbitMQ   A(rlvaro Videla)

Who?

Thursday, September 29, 2011

Page 3: Scaling websites with RabbitMQ   A(rlvaro Videla)

About Me

• Software Development at Liip AG

• Writing “RabbitMQ in Action” for Manning

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

• Twitter: @old_sound

Thursday, September 29, 2011

Page 4: Scaling websites with RabbitMQ   A(rlvaro Videla)

Why Do I need RabbitMQ?

Thursday, September 29, 2011

Page 5: Scaling websites with RabbitMQ   A(rlvaro Videla)

The User

Thursday, September 29, 2011

Page 6: Scaling websites with RabbitMQ   A(rlvaro Videla)

I don’t want to waittill your app resizes

my image!

Thursday, September 29, 2011

Page 7: Scaling websites with RabbitMQ   A(rlvaro Videla)

The Product Owner

Thursday, September 29, 2011

Page 8: Scaling websites with RabbitMQ   A(rlvaro Videla)

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

Thursday, September 29, 2011

Page 9: Scaling websites with RabbitMQ   A(rlvaro Videla)

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

I forgot to mention we need it for tomorrow…

Thursday, September 29, 2011

Page 10: Scaling websites with RabbitMQ   A(rlvaro Videla)

The Sysadmin

Thursday, September 29, 2011

Page 11: Scaling websites with RabbitMQ   A(rlvaro Videla)

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

Thursday, September 29, 2011

Page 12: Scaling websites with RabbitMQ   A(rlvaro Videla)

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

We need this fixed for yesterday!

Thursday, September 29, 2011

Page 13: Scaling websites with RabbitMQ   A(rlvaro Videla)

The Developer in the other team

Thursday, September 29, 2011

Page 14: Scaling websites with RabbitMQ   A(rlvaro Videla)

I need to call your PHP stuff but from Python

Thursday, September 29, 2011

Page 15: Scaling websites with RabbitMQ   A(rlvaro Videla)

I need to call your PHP stuff but from Python

And also Java starting next week

Thursday, September 29, 2011

Page 16: Scaling websites with RabbitMQ   A(rlvaro Videla)

You

Thursday, September 29, 2011

Page 17: Scaling websites with RabbitMQ   A(rlvaro Videla)

FML!

Thursday, September 29, 2011

Page 18: Scaling websites with RabbitMQ   A(rlvaro Videla)

Is there a solution?

Thursday, September 29, 2011

Page 19: Scaling websites with RabbitMQ   A(rlvaro Videla)

RabbitMQ & AMQP

Thursday, September 29, 2011

Page 20: Scaling websites with RabbitMQ   A(rlvaro Videla)

AMQP

Thursday, September 29, 2011

Page 21: Scaling websites with RabbitMQ   A(rlvaro Videla)

AMQP

• Advanced Message Queuing Protocol

• Suits Interoperability

• Completely Open Protocol

• Binary Protocol

• AMQP Model

• AMQP Wire Format

Thursday, September 29, 2011

Page 22: Scaling websites with RabbitMQ   A(rlvaro Videla)

AMQP Model

• Exchanges

• Message Queues

• Bindings

• Rules for binding them

Thursday, September 29, 2011

Page 23: Scaling websites with RabbitMQ   A(rlvaro Videla)

AMQP Wire Protocol

• Functional Layer

• Transport Layer

Thursday, September 29, 2011

Page 24: Scaling websites with RabbitMQ   A(rlvaro Videla)

Message Flow

http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.0/html/Messaging_Tutorial/chap-Messaging_Tutorial-Initial_Concepts.html

Thursday, September 29, 2011

Page 25: Scaling websites with RabbitMQ   A(rlvaro Videla)

Exchange Types

• Fanout

• Direct

• Topic

Thursday, September 29, 2011

Page 29: Scaling websites with RabbitMQ   A(rlvaro Videla)

Usage Scenarios

Thursday, September 29, 2011

Page 30: Scaling websites with RabbitMQ   A(rlvaro Videla)

Usage Scenarios

• Batch Processing

Thursday, September 29, 2011

Page 31: Scaling websites with RabbitMQ   A(rlvaro Videla)

Usage Scenarios

• Batch Processing

• Image Uploading

Thursday, September 29, 2011

Page 32: Scaling websites with RabbitMQ   A(rlvaro Videla)

Usage Scenarios

• Batch Processing

• Image Uploading

• Distributed Logging

Thursday, September 29, 2011

Page 33: Scaling websites with RabbitMQ   A(rlvaro Videla)

Scenario

Batch Processing

Thursday, September 29, 2011

Page 34: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

Thursday, September 29, 2011

Page 35: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Generate XML

Thursday, September 29, 2011

Page 36: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Generate XML

• Distribution Over a Cluster

Thursday, September 29, 2011

Page 37: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Generate XML

• Distribution Over a Cluster

• Elasticity - Add/Remove new workers

Thursday, September 29, 2011

Page 38: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Generate XML

• Distribution Over a Cluster

• Elasticity - Add/Remove new workers

• No Code Changes

Thursday, September 29, 2011

Page 39: Scaling websites with RabbitMQ   A(rlvaro Videla)

Design

Thursday, September 29, 2011

Page 40: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

Thursday, September 29, 2011

Page 41: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

Thursday, September 29, 2011

Page 42: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

Thursday, September 29, 2011

Page 43: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

Thursday, September 29, 2011

Page 44: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

Thursday, September 29, 2011

Page 45: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

Thursday, September 29, 2011

Page 46: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();}

Thursday, September 29, 2011

Page 47: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();}

Thursday, September 29, 2011

Page 48: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();}

Thursday, September 29, 2011

Page 49: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();}

Thursday, September 29, 2011

Page 50: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();}

Thursday, September 29, 2011

Page 51: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();}

Thursday, September 29, 2011

Page 52: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();}

Thursday, September 29, 2011

Page 53: Scaling websites with RabbitMQ   A(rlvaro Videla)

Scenario

Upload Pictures

Thursday, September 29, 2011

Page 54: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

Thursday, September 29, 2011

Page 55: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Upload Picture

Thursday, September 29, 2011

Page 56: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Upload Picture

• Reward User

Thursday, September 29, 2011

Page 57: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Upload Picture

• Reward User

• Notify User Friends

Thursday, September 29, 2011

Page 58: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Upload Picture

• Reward User

• Notify User Friends

• Resize Picture

Thursday, September 29, 2011

Page 59: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Upload Picture

• Reward User

• Notify User Friends

• Resize Picture

• No Code Changes

Thursday, September 29, 2011

Page 60: Scaling websites with RabbitMQ   A(rlvaro Videla)

Design

Thursday, September 29, 2011

Page 61: Scaling websites with RabbitMQ   A(rlvaro Videla)

Design

Thursday, September 29, 2011

Page 62: Scaling websites with RabbitMQ   A(rlvaro Videla)

Design

Thursday, September 29, 2011

Page 63: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 64: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 65: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 66: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 67: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 68: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

}

Thursday, September 29, 2011

Page 69: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

}

Thursday, September 29, 2011

Page 70: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

}

Thursday, September 29, 2011

Page 71: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

}

Thursday, September 29, 2011

Page 72: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

}

Thursday, September 29, 2011

Page 73: Scaling websites with RabbitMQ   A(rlvaro Videla)

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();

}

Thursday, September 29, 2011

Page 74: Scaling websites with RabbitMQ   A(rlvaro Videla)

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']);

};

Thursday, September 29, 2011

Page 75: Scaling websites with RabbitMQ   A(rlvaro Videla)

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']);

};

Thursday, September 29, 2011

Page 76: Scaling websites with RabbitMQ   A(rlvaro Videla)

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']);

};

Thursday, September 29, 2011

Page 77: Scaling websites with RabbitMQ   A(rlvaro Videla)

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']);

};

Thursday, September 29, 2011

Page 78: Scaling websites with RabbitMQ   A(rlvaro Videla)

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']);

};

Thursday, September 29, 2011

Page 79: Scaling websites with RabbitMQ   A(rlvaro Videla)

Scenario

Distributed Logging

Thursday, September 29, 2011

Page 80: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

Thursday, September 29, 2011

Page 81: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Several Web Servers

Thursday, September 29, 2011

Page 82: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Several Web Servers

• Logic Separated by Module/Action

Thursday, September 29, 2011

Page 83: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Several Web Servers

• Logic Separated by Module/Action

• Several Log Levels:

Thursday, September 29, 2011

Page 84: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Several Web Servers

• Logic Separated by Module/Action

• Several Log Levels:

• Info, Warning, Error

Thursday, September 29, 2011

Page 85: Scaling websites with RabbitMQ   A(rlvaro Videla)

Requirements

• Several Web Servers

• Logic Separated by Module/Action

• Several Log Levels:

• Info, Warning, Error

• Add/Remove log listeners at will

Thursday, September 29, 2011

Page 86: Scaling websites with RabbitMQ   A(rlvaro Videla)

Design

Thursday, September 29, 2011

Page 87: Scaling websites with RabbitMQ   A(rlvaro Videla)

Design

Thursday, September 29, 2011

Page 88: Scaling websites with RabbitMQ   A(rlvaro Videla)

Design

Thursday, September 29, 2011

Page 89: Scaling websites with RabbitMQ   A(rlvaro Videla)

Design

Thursday, September 29, 2011

Page 90: Scaling websites with RabbitMQ   A(rlvaro Videla)

Design

Thursday, September 29, 2011

Page 91: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 92: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 93: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 94: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 95: Scaling websites with RabbitMQ   A(rlvaro Videla)

Consumer Code

Get messages sent by host:

server1

Thursday, September 29, 2011

Page 96: Scaling websites with RabbitMQ   A(rlvaro Videla)

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.#');

Thursday, September 29, 2011

Page 97: Scaling websites with RabbitMQ   A(rlvaro Videla)

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.#');

Thursday, September 29, 2011

Page 98: Scaling websites with RabbitMQ   A(rlvaro Videla)

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.#');

Thursday, September 29, 2011

Page 99: Scaling websites with RabbitMQ   A(rlvaro Videla)

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.#');

Thursday, September 29, 2011

Page 100: Scaling websites with RabbitMQ   A(rlvaro Videla)

Consumer Code

Get all error messages

Thursday, September 29, 2011

Page 101: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 102: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 103: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 104: Scaling websites with RabbitMQ   A(rlvaro Videla)

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');

Thursday, September 29, 2011

Page 105: Scaling websites with RabbitMQ   A(rlvaro Videla)

Why RabbitMQ?

Thursday, September 29, 2011

Page 106: Scaling websites with RabbitMQ   A(rlvaro Videla)

RabbitMQ

• Enterprise Messaging System

• Open Source MPL

• Written in Erlang/OTP

• Commercial Support

Thursday, September 29, 2011

Page 107: Scaling websites with RabbitMQ   A(rlvaro Videla)

Features

• Reliable and High Scalable

• Easy To install

• Easy To Cluster

• Runs on: Windows, Solaris, Linux, OSX

• AMQP 0.8 - 0.9.1

Thursday, September 29, 2011

Page 108: Scaling websites with RabbitMQ   A(rlvaro Videla)

Client Libraries

• Java

• .NET/C#

• Erlang

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

Thursday, September 29, 2011

Page 109: Scaling websites with RabbitMQ   A(rlvaro Videla)

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

Thursday, September 29, 2011

Page 110: Scaling websites with RabbitMQ   A(rlvaro Videla)

One Setup for HA

Thursday, September 29, 2011

Page 111: Scaling websites with RabbitMQ   A(rlvaro Videla)

Conclusion

Thursday, September 29, 2011

Page 112: Scaling websites with RabbitMQ   A(rlvaro Videla)

Conclusion

• Flexibility

Thursday, September 29, 2011

Page 113: Scaling websites with RabbitMQ   A(rlvaro Videla)

Conclusion

• Flexibility

• Scalability

Thursday, September 29, 2011

Page 114: Scaling websites with RabbitMQ   A(rlvaro Videla)

Conclusion

• Flexibility

• Scalability

• Interoperability

Thursday, September 29, 2011

Page 115: Scaling websites with RabbitMQ   A(rlvaro Videla)

Conclusion

• Flexibility

• Scalability

• Interoperability

• Reduce Ops

Thursday, September 29, 2011

Page 116: Scaling websites with RabbitMQ   A(rlvaro Videla)

Questions?

Thursday, September 29, 2011

Page 117: Scaling websites with RabbitMQ   A(rlvaro Videla)

Thanks!

Thursday, September 29, 2011