SlideShare a Scribd company logo
Scaling Web Apps
                               With RabbitMQ
                                   Álvaro Videla | Liip AG


                                  HighLoad ++ 2011


Thursday, September 29, 2011
Who?


Thursday, September 29, 2011
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
Why Do I need
                                RabbitMQ?


Thursday, September 29, 2011
The User



Thursday, September 29, 2011
I don’t want to wait
                               till your app resizes
                                     my image!


Thursday, September 29, 2011
The Product Owner



Thursday, September 29, 2011
Can we also notify the
                    user friends when she
                    uploads a new image?


Thursday, September 29, 2011
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
The Sysadmin



Thursday, September 29, 2011
Dumb! You’re delivering
                    full size images!
                 The bandwidth bill has
                         tripled!

Thursday, September 29, 2011
Dumb! You’re delivering
                    full size images!
                 The bandwidth bill has
                         tripled!
                               We need this fixed for yesterday!
Thursday, September 29, 2011
The Developer in the
                           other team


Thursday, September 29, 2011
I need to call your PHP
                   stuff but from Python


Thursday, September 29, 2011
I need to call your PHP
                   stuff but from Python

                               And also Java starting next week
Thursday, September 29, 2011
You



Thursday, September 29, 2011
FML!

Thursday, September 29, 2011
Is there a solution?



Thursday, September 29, 2011
RabbitMQ & AMQP



Thursday, September 29, 2011
AMQP



Thursday, September 29, 2011
AMQP
                    • Advanced Message Queuing Protocol
                    • Suits Interoperability
                    • Completely Open Protocol
                    • Binary Protocol
                    • AMQP Model
                    • AMQP Wire Format
Thursday, September 29, 2011
AMQP Model

                    • Exchanges
                    • Message Queues
                    • Bindings
                    • Rules for binding them

Thursday, September 29, 2011
AMQP Wire Protocol


                    • Functional Layer
                    • Transport Layer


Thursday, September 29, 2011
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
Exchange Types

                    • Fanout
                    • Direct
                    • Topic


Thursday, September 29, 2011
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.0/html/Messaging_Tutorial/sect-Messaging_Tutorial-Initial_Concepts-
                                                                      Fanout_Exchange.html




Thursday, September 29, 2011
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.0/html/Messaging_Tutorial/sect-Messaging_Tutorial-Initial_Concepts-
                                                                       Direct_Exchange.html




Thursday, September 29, 2011
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/1.0/html/Messaging_Tutorial/sect-Messaging_Tutorial-Initial_Concepts-
                                                                       Topic_Exchange.html




Thursday, September 29, 2011
Usage Scenarios




Thursday, September 29, 2011
Usage Scenarios

                    • Batch Processing




Thursday, September 29, 2011
Usage Scenarios

                    • Batch Processing
                    • Image Uploading




Thursday, September 29, 2011
Usage Scenarios

                    • Batch Processing
                    • Image Uploading
                    • Distributed Logging



Thursday, September 29, 2011
Scenario


                               Batch Processing



Thursday, September 29, 2011
Requirements




Thursday, September 29, 2011
Requirements

                    • Generate XML




Thursday, September 29, 2011
Requirements

                    • Generate XML
                    • Distribution Over a Cluster



Thursday, September 29, 2011
Requirements

                    • Generate XML
                    • Distribution Over a Cluster
                    • Elasticity - Add/Remove new workers


Thursday, September 29, 2011
Requirements

                    • Generate XML
                    • Distribution Over a Cluster
                    • Elasticity - Add/Remove new workers
                    • No Code Changes

Thursday, September 29, 2011
Design




Thursday, September 29, 2011
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
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
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
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
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
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
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
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
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
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
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
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
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
Scenario


                               Upload Pictures



Thursday, September 29, 2011
Requirements




Thursday, September 29, 2011
Requirements
                    • Upload Picture




Thursday, September 29, 2011
Requirements
                    • Upload Picture
                    • Reward User




Thursday, September 29, 2011
Requirements
                    • Upload Picture
                    • Reward User
                    • Notify User Friends



Thursday, September 29, 2011
Requirements
                    • Upload Picture
                    • Reward User
                    • Notify User Friends
                    • Resize Picture


Thursday, September 29, 2011
Requirements
                    • Upload Picture
                    • Reward User
                    • Notify User Friends
                    • Resize Picture
                    • No Code Changes

Thursday, September 29, 2011
Design




Thursday, September 29, 2011
Design




Thursday, September 29, 2011
Design




Thursday, September 29, 2011
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Scenario


                           Distributed Logging



Thursday, September 29, 2011
Requirements




Thursday, September 29, 2011
Requirements
                    • Several Web Servers




Thursday, September 29, 2011
Requirements
                    • Several Web Servers
                    • Logic Separated by Module/Action




Thursday, September 29, 2011
Requirements
                    • Several Web Servers
                    • Logic Separated by Module/Action
                    • Several Log Levels:



Thursday, September 29, 2011
Requirements
                    • Several Web Servers
                    • Logic Separated by Module/Action
                    • Several Log Levels:
                     • Info, Warning, Error


Thursday, September 29, 2011
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
Design




Thursday, September 29, 2011
Design




Thursday, September 29, 2011
Design




Thursday, September 29, 2011
Design




Thursday, September 29, 2011
Design




Thursday, September 29, 2011
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
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
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
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
Consumer Code

                                Get messages sent by host:

                                        server1




Thursday, September 29, 2011
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
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
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
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
Consumer Code


                                Get all error messages




Thursday, September 29, 2011
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
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
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
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
Why RabbitMQ?



Thursday, September 29, 2011
RabbitMQ

                    • Enterprise Messaging System
                    • Open Source MPL
                    • Written in Erlang/OTP
                    • Commercial Support

Thursday, September 29, 2011
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
Client Libraries

                    • Java
                    • .NET/C#
                    • Erlang
                    • Ruby, Python, PHP, Perl, AS3, Lisp, Scala,
                           Clojure, Haskell



Thursday, September 29, 2011
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
One Setup for HA




Thursday, September 29, 2011
Conclusion




Thursday, September 29, 2011
Conclusion

                    • Flexibility




Thursday, September 29, 2011
Conclusion

                    • Flexibility
                    • Scalability



Thursday, September 29, 2011
Conclusion

                    • Flexibility
                    • Scalability
                    • Interoperability


Thursday, September 29, 2011
Conclusion

                    • Flexibility
                    • Scalability
                    • Interoperability
                    • Reduce Ops

Thursday, September 29, 2011
Questions?



Thursday, September 29, 2011
Thanks!



Thursday, September 29, 2011

More Related Content

PDF
Erlang для высоконагруженных систем (Валентин Нечаев)
PPTX
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
PPTX
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
PDF
Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...
PPTX
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
PDF
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
PDF
Theres a rabbit on my symfony
PDF
Scaling webappswithrabbitmq
Erlang для высоконагруженных систем (Валентин Нечаев)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
Artisto: опыт запуска нейросетей в production / Эдуард Тянтов (Mail.ru Group)
Sphinx 3.0 и RT-индексы на основном поиске Avito / Андрей Смирнов, Вячеслав К...
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
Theres a rabbit on my symfony
Scaling webappswithrabbitmq

Similar to Scaling websites with RabbitMQ A(rlvaro Videla) (20)

PDF
Integrating php withrabbitmq_zendcon
PDF
Rabbit mq messaginginthecloud_v_mworld_2010_ms
PDF
Rabbit mq messaginginthecloud_v_mworld_2010_ms
PDF
Achieving Scale With Messaging And The Cloud 20090709
PDF
Taming the rabbit
PDF
Desacoplando aplicaciones
PDF
Styles of Applicaton Integration Using Spring
PPTX
High powered messaging with RabbitMQ
ODP
The Art of Message Queues - TEKX
PDF
Achieving Scale With Messaging And The Cloud
PDF
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
PDF
WTF Is Messaging And Why You Should Use It?
PDF
Messaging patterns
PPTX
The bigrabbit
PDF
Introduction to message_queue
PDF
Enterprise Messaging with RabbitMQ.pdf
PDF
The Future of Messaging: RabbitMQ and AMQP
PDF
Message Queues : A Primer - International PHP Conference Fall 2012
PDF
Ruby Microservices with RabbitMQ
PDF
Messaging with RabbitMQ and AMQP
Integrating php withrabbitmq_zendcon
Rabbit mq messaginginthecloud_v_mworld_2010_ms
Rabbit mq messaginginthecloud_v_mworld_2010_ms
Achieving Scale With Messaging And The Cloud 20090709
Taming the rabbit
Desacoplando aplicaciones
Styles of Applicaton Integration Using Spring
High powered messaging with RabbitMQ
The Art of Message Queues - TEKX
Achieving Scale With Messaging And The Cloud
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
WTF Is Messaging And Why You Should Use It?
Messaging patterns
The bigrabbit
Introduction to message_queue
Enterprise Messaging with RabbitMQ.pdf
The Future of Messaging: RabbitMQ and AMQP
Message Queues : A Primer - International PHP Conference Fall 2012
Ruby Microservices with RabbitMQ
Messaging with RabbitMQ and AMQP
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ad

Recently uploaded (20)

PDF
Electronic commerce courselecture one. Pdf
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Tartificialntelligence_presentation.pptx
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Machine learning based COVID-19 study performance prediction
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PPTX
Big Data Technologies - Introduction.pptx
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Empathic Computing: Creating Shared Understanding
PDF
cuic standard and advanced reporting.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Approach and Philosophy of On baking technology
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PPTX
MYSQL Presentation for SQL database connectivity
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
Electronic commerce courselecture one. Pdf
20250228 LYD VKU AI Blended-Learning.pptx
Tartificialntelligence_presentation.pptx
Accuracy of neural networks in brain wave diagnosis of schizophrenia
Diabetes mellitus diagnosis method based random forest with bat algorithm
Unlocking AI with Model Context Protocol (MCP)
Machine learning based COVID-19 study performance prediction
Building Integrated photovoltaic BIPV_UPV.pdf
Group 1 Presentation -Planning and Decision Making .pptx
Big Data Technologies - Introduction.pptx
Assigned Numbers - 2025 - Bluetooth® Document
Empathic Computing: Creating Shared Understanding
cuic standard and advanced reporting.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Approach and Philosophy of On baking technology
SOPHOS-XG Firewall Administrator PPT.pptx
MYSQL Presentation for SQL database connectivity
NewMind AI Weekly Chronicles - August'25-Week II
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf

Scaling websites with RabbitMQ A(rlvaro Videla)

  • 1. Scaling Web Apps With RabbitMQ Álvaro Videla | Liip AG HighLoad ++ 2011 Thursday, September 29, 2011
  • 3. 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
  • 4. Why Do I need RabbitMQ? Thursday, September 29, 2011
  • 6. I don’t want to wait till your app resizes my image! Thursday, September 29, 2011
  • 7. The Product Owner Thursday, September 29, 2011
  • 8. Can we also notify the user friends when she uploads a new image? Thursday, September 29, 2011
  • 9. 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
  • 11. Dumb! You’re delivering full size images! The bandwidth bill has tripled! Thursday, September 29, 2011
  • 12. Dumb! You’re delivering full size images! The bandwidth bill has tripled! We need this fixed for yesterday! Thursday, September 29, 2011
  • 13. The Developer in the other team Thursday, September 29, 2011
  • 14. I need to call your PHP stuff but from Python Thursday, September 29, 2011
  • 15. I need to call your PHP stuff but from Python And also Java starting next week Thursday, September 29, 2011
  • 18. Is there a solution? Thursday, September 29, 2011
  • 19. RabbitMQ & AMQP Thursday, September 29, 2011
  • 21. AMQP • Advanced Message Queuing Protocol • Suits Interoperability • Completely Open Protocol • Binary Protocol • AMQP Model • AMQP Wire Format Thursday, September 29, 2011
  • 22. AMQP Model • Exchanges • Message Queues • Bindings • Rules for binding them Thursday, September 29, 2011
  • 23. AMQP Wire Protocol • Functional Layer • Transport Layer Thursday, September 29, 2011
  • 24. 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
  • 25. Exchange Types • Fanout • Direct • Topic Thursday, September 29, 2011
  • 30. Usage Scenarios • Batch Processing Thursday, September 29, 2011
  • 31. Usage Scenarios • Batch Processing • Image Uploading Thursday, September 29, 2011
  • 32. Usage Scenarios • Batch Processing • Image Uploading • Distributed Logging Thursday, September 29, 2011
  • 33. Scenario Batch Processing Thursday, September 29, 2011
  • 35. Requirements • Generate XML Thursday, September 29, 2011
  • 36. Requirements • Generate XML • Distribution Over a Cluster Thursday, September 29, 2011
  • 37. Requirements • Generate XML • Distribution Over a Cluster • Elasticity - Add/Remove new workers Thursday, September 29, 2011
  • 38. Requirements • Generate XML • Distribution Over a Cluster • Elasticity - Add/Remove new workers • No Code Changes Thursday, September 29, 2011
  • 40. 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
  • 41. 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
  • 42. 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
  • 43. 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
  • 44. 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
  • 45. 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
  • 46. 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
  • 47. 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
  • 48. 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
  • 49. 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
  • 50. 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
  • 51. 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
  • 52. 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
  • 53. Scenario Upload Pictures Thursday, September 29, 2011
  • 55. Requirements • Upload Picture Thursday, September 29, 2011
  • 56. Requirements • Upload Picture • Reward User Thursday, September 29, 2011
  • 57. Requirements • Upload Picture • Reward User • Notify User Friends Thursday, September 29, 2011
  • 58. Requirements • Upload Picture • Reward User • Notify User Friends • Resize Picture Thursday, September 29, 2011
  • 59. Requirements • Upload Picture • Reward User • Notify User Friends • Resize Picture • No Code Changes Thursday, September 29, 2011
  • 63. 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
  • 64. 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
  • 65. 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
  • 66. 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
  • 67. 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
  • 68. 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
  • 69. 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
  • 70. 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
  • 71. 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
  • 72. 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
  • 73. 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
  • 74. 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
  • 75. 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
  • 76. 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
  • 77. 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
  • 78. 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
  • 79. Scenario Distributed Logging Thursday, September 29, 2011
  • 81. Requirements • Several Web Servers Thursday, September 29, 2011
  • 82. Requirements • Several Web Servers • Logic Separated by Module/Action Thursday, September 29, 2011
  • 83. Requirements • Several Web Servers • Logic Separated by Module/Action • Several Log Levels: Thursday, September 29, 2011
  • 84. Requirements • Several Web Servers • Logic Separated by Module/Action • Several Log Levels: • Info, Warning, Error Thursday, September 29, 2011
  • 85. 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
  • 91. 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
  • 92. 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
  • 93. 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
  • 94. 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
  • 95. Consumer Code Get messages sent by host: server1 Thursday, September 29, 2011
  • 96. 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
  • 97. 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
  • 98. 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
  • 99. 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
  • 100. Consumer Code Get all error messages Thursday, September 29, 2011
  • 101. 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
  • 102. 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
  • 103. 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
  • 104. 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
  • 106. RabbitMQ • Enterprise Messaging System • Open Source MPL • Written in Erlang/OTP • Commercial Support Thursday, September 29, 2011
  • 107. 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
  • 108. Client Libraries • Java • .NET/C# • Erlang • Ruby, Python, PHP, Perl, AS3, Lisp, Scala, Clojure, Haskell Thursday, September 29, 2011
  • 109. 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
  • 110. One Setup for HA Thursday, September 29, 2011
  • 112. Conclusion • Flexibility Thursday, September 29, 2011
  • 113. Conclusion • Flexibility • Scalability Thursday, September 29, 2011
  • 114. Conclusion • Flexibility • Scalability • Interoperability Thursday, September 29, 2011
  • 115. Conclusion • Flexibility • Scalability • Interoperability • Reduce Ops Thursday, September 29, 2011