Scaling Web Apps With RabbitMQ

Similar documents
Make your application real-time with PubSubHubbub. Brett Slatkin May 19th, 2010

PubSubHubbub Real-time RSS for the Decentralized Web. Brett Slatkin Google Inc. 18 November 2009

IEMS 5722 Mobile Network Programming and Distributed Server Architecture

IERG 4080 Building Scalable Internet-based Services

AMQP and Beyond. Messaging by Extending RabbitMQ. Tony Garnock-Jones

Introduction to Protocols for Realtime Data Sharing. Deepti Nagarkar

Microservices, Messaging and Science Gateways. Review microservices for science gateways and then discuss messaging systems.

The Emergence of the Datacenter Developer. Tobi Knaup, Co-Founder & CTO at

RabbitMQ Overview. Tony Garnock-Jones

Transitioning from C# to Scala Using Apache Thrift. Twitter Finagle

RabbitMQ: Messaging in the Cloud

IN ACTION. Alvaro Videla Jason J.W. Williams. Distributed messaging for everyone FOREWORD BY ALEXIS RICHARDSON MANNING

NODE.JS SERVER SIDE JAVASCRIPT. Introduc)on Node.js

MOM MESSAGE ORIENTED MIDDLEWARE OVERVIEW OF MESSAGE ORIENTED MIDDLEWARE TECHNOLOGIES AND CONCEPTS. MOM Message Oriented Middleware

Message Queueing. 20 March 2015

in Action RabbitMQ Distributed Messaging for Everyone ALVARO VIDELA JASON J.W. WILLIAMS /II MANNING Shelter Island

Design and Architecture. Derek Collison

Distributed Systems. 29. Distributed Caching Paul Krzyzanowski. Rutgers University. Fall 2014

Distributed Message Service. User Guide. Issue 14 Date

Erlang in the Heroku Cloud

Instant Integration into the AMQP Cloud with Apache Qpid Messenger. Rafael Schloming Principle Software Red Hat

Cloud Foundry Bootcamp

Producer sends messages to the "hello" queue. The consumer receives messages from that queue.

Basic Concepts of the Energy Lab 2.0 Co-Simulation Platform

UNDER THE HOOD. ROGER NUNN Principal Architect/EMEA Solution Manager 21/01/2015

Indirect Communication

Integration of the Managed Trading Service with AMQP

Open source, high performance database. July 2012

WebSphere MQ Update. Paul Dennis WMQ Development 2007 IBM Corporation

Performance Evaluation and Comparison of Distributed Messaging Using Message Oriented Middleware

Enhancing cloud applications by using messaging services IBM Corporation

Storm. Distributed and fault-tolerant realtime computation. Nathan Marz Twitter

Scalable task distribution with Scala, Akka and Mesos. Dario

Getting Started with RabbitMQ and CloudAMQP

Building loosely coupled and scalable systems using Event-Driven Architecture. Jonas Bonér Patrik Nordwall Andreas Källberg

Time and Space. Indirect communication. Time and space uncoupling. indirect communication

How to Develop Responsive Applications with IBM MQ Light (beta) Matthew Whitehead WebSphere MQ Development 1st July 2014

MSG: An Overview of a Messaging System for the Grid

Introduction to EGF. Benoît Langlois / Thales Global Services.

Learn to Code with C#

Data Acquisition. The reference Big Data stack

Connect Applications and Services Together with the Enterprise Service Bus

Having fun with Delphi and AMQP starter

AZURE CONTAINER INSTANCES

Playing tasks with Django & Celery

COMP 201: Principles of Programming

Eduardo

IoT with Apache ActiveMQ, Camel and Spark

NodeJS and JavaScripteverywhere

What is Cloud Computing? What are the Private and Public Clouds? What are IaaS, PaaS, and SaaS? What is the Amazon Web Services (AWS)?

Java in der Cloud Aktuelle Möglichkeiten und Entwicklungen

Distributed Systems. 03r. Python Web Services Programming Tutorial. Paul Krzyzanowski TA: Long Zhao Rutgers University Fall 2017

CS October 2017

ØMQ and PyØMQ. Simple and Fast Messaging. Brian Granger SciPy 2010

Steven Edouard SDET, US - DX Audience West Microsoft Bruno Terkaly Principal Software Engineer - Microsoft

Startups and Mobile Apps on AWS. Dave Schappell, Startup Business Development Manager, AWS September 11, 2013

Configure Sensu and other Actions to Register Clients

Grouper Provisioning: Locally & Cloud Bill Thompson, Lafayette College Chris Hyzer, University of Pennsylvania Bert Bee-Lindgren, Georgia Tech

Let's Play... Try to name the databases described on the following slides...

IBM s statements regarding its plans, directions, and intent are subject to change or withdrawal without notice at IBM s sole discretion.

Get it done. One event at a time. How I learned to stop worrying and love EventMachine.

Rapid Large-Scale SOA - Connected Products at Leapfrog Enterprises

Create High Performance, Massively Scalable Messaging Solutions with Apache ActiveBlaze

Scala, Your Next Programming Language

OpenStack Summit Half-Day Track

CADEC Senaste nytt från QCon Mats Ekhammar

grpc - A solution for RPCs by Google Distributed Systems Seminar at Charles University in Prague, Nov 2016 Jan Tattermusch - grpc Software Engineer

Seminar report Google App Engine Submitted in partial fulfillment of the requirement for the award of degree Of CSE

Red Hat Summit 2009 Jonathan Robie

Data Acquisition. The reference Big Data stack

Open Source MQTT Brokers. Leon Anavi Konsulko Group OpenIoT Summit 2018

Backend Development. SWE 432, Fall Web Application Development

Grading for Assignment #1

The Gearman Cookbook OSCON Eric Day Senior Software Rackspace

Erlang and Thrift for Web Development

Introduction to Internet of Things Prof. Sudip Misra Department of Computer Science & Engineering Indian Institute of Technology, Kharagpur

CSCI-1680 RPC and Data Representation. Rodrigo Fonseca

Ceph Intro & Architectural Overview. Federico Lucifredi Product Management Director, Ceph Storage Vancouver & Guadalajara, May 18th, 2015

IntegraBng Splunk Data and FuncBonality Using the Splunk SDK for Java

Publish Content & Measure Success 1

Adv. Course in Programming Languages

TITLE: PRE-REQUISITE THEORY. 1. Introduction to Hadoop. 2. Cluster. Implement sort algorithm and run it using HADOOP

Pahrump Valley 4 Wheelers Instructions

Robot Programming with Lisp

Building (Better) Data Pipelines using Apache Airflow

Start Up Benoît Langlois / Thales Global Services Eclipse (EMFT) EGF 2011 by Thales; made available under the EPL v1.

Open Source MQTT Brokers. Leon Anavi Konsulko Group OpenIoT Summit 2018

Cloud Computing 2. CSCI 4850/5850 High-Performance Computing Spring 2018

Infrastructure Clouds for Science and Education: Platform Tools

First Programming Language in CS Education The Arguments for Scala

Homework 9: Stock Search Android App with Facebook Post A Mobile Phone Exercise

Read & Download (PDF Kindle) Beginning Microsoft SQL Server 2012 Programming

The Script Bowl Featuring Groovy, JRuby, Jython and Scala. Raghavan Rags N. Srinivas CTO, Technology Evangelism

Assigns a number to 110,000 letters/glyphs U+0041 is an A U+0062 is an a. U+00A9 is a copyright symbol U+0F03 is an

Error Processing: An Exercise in Functional Design

Cloud Computing 4/17/2016. Outline. Cloud Computing. Centralized versus Distributed Computing Some people argue that Cloud Computing. Cloud Computing.

CSCI 5417 Information Retrieval Systems! What is Information Retrieval?

Zend PHP Cloud Application Platform

Micro- Services. Distributed Systems. DevOps

Developing Microsoft Azure Solutions (70-532) Syllabus

Transcription:

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

Who?

About Me Development Manager at TheNetCircle.com Writing RabbitMQ in Action for Manning Blog: http://videlalvaro.github.com/ Twitter: @old_sound

Why Do I need RabbitMQ?

The User

I don t want to wait till your app resizes my image!

The Product Owner

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

Can we also notify the user friends when she uploads a new image? I forgot to mention we need it for tomorrow

The Sysadmin

Dumb! You re delivering full size images! The bandwidth bill has tripled!

Dumb! You re delivering full size images! The bandwidth bill has tripled! We need this fixed for yesterday!

The Developer in the other team

I need to call your PHP stuff but from Python

I need to call your PHP stuff but from Python And also Java starting next week

You

FML!

Is there a solution?

RabbitMQ & AMQP

AMQP

AMQP Advanced Message Queuing Protocol Suits Interoperability Completely Open Protocol Binary Protocol AMQP Model AMQP Wire Format

AMQP Model Exchanges Message Queues Bindings Rules for binding them

AMQP Wire Protocol Functional Layer Transport Layer

Message Flow http://www.redhat.com/docs/en-us/red_hat_enterprise_mrg/1.0/html/messaging_tutorial/chap-messaging_tutorial-initial_concepts.html

Exchange Types Fanout Direct Topic

http://www.redhat.com/docs/en-us/red_hat_enterprise_mrg/1.0/html/messaging_tutorial/sect-messaging_tutorial-initial_concepts- Fanout_Exchange.html

http://www.redhat.com/docs/en-us/red_hat_enterprise_mrg/1.0/html/messaging_tutorial/sect-messaging_tutorial-initial_concepts- Direct_Exchange.html

http://www.redhat.com/docs/en-us/red_hat_enterprise_mrg/1.0/html/messaging_tutorial/sect-messaging_tutorial-initial_concepts- Topic_Exchange.html

Usage Scenarios

Usage Scenarios Batch Processing

Usage Scenarios Batch Processing Image Uploading

Usage Scenarios Batch Processing Image Uploading Distributed Logging

Scenario Batch Processing

Requirements

Requirements Generate XML

Requirements Generate XML Distribution Over a Cluster

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

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

Design

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

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

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

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

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

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

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

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

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

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

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

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

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

Scenario Upload Pictures

Requirements

Requirements Upload Picture

Requirements Upload Picture Reward User

Requirements Upload Picture Reward User Notify User Friends

Requirements Upload Picture Reward User Notify User Friends Resize Picture

Requirements Upload Picture Reward User Notify User Friends Resize Picture No Code Changes

Design

Design

Design

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Scenario Distributed Logging

Requirements

Requirements Several Web Servers

Requirements Several Web Servers Logic Separated by Module/Action

Requirements Several Web Servers Logic Separated by Module/Action Several Log Levels:

Requirements Several Web Servers Logic Separated by Module/Action Several Log Levels: Info, Warning, Error

Requirements Several Web Servers Logic Separated by Module/Action Several Log Levels: Info, Warning, Error Add/Remove log listeners at will

Design

Design

Design

Design

Design

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

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

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

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

Consumer Code Get messages sent by host: server1

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

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

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

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

Consumer Code Get all error messages

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

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

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

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

Why RabbitMQ?

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

Features Reliable and High Scalable Easy To install Easy To Cluster Runs on: Windows, Solaris, Linux, OSX AMQP 0.8-0.9.1

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

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

One Setup for HA

Conclusion

Flexibility Conclusion

Conclusion Flexibility Scalability

Conclusion Flexibility Scalability Interoperability

Conclusion Flexibility Scalability Interoperability Reduce Ops

Questions?

Thanks! Álvaro Videla http://twitter.com/old_sound http://github.com/videlalvaro http://github.com/tnc http://www.slideshare.net/old_sound