SlideShare a Scribd company logo
Scaling Applications
with RabbitMQ
Alvaro Videla - RabbitMQ
Alvaro Videla
•
•
•
•
•

Developer Advocate at Pivotal / RabbitMQ!
Co-Author of RabbitMQ in Action!
Creator of the RabbitMQ Simulator!
Blogs about RabbitMQ Internals: http://videlalvaro.github.io/internals.html!
@old_sound — alvaro@rabbitmq.com — github.com/videlalvaro

About Me
Co-authored!
!

RabbitMQ in Action!
http://bit.ly/rabbitmq
About this Talk

•

Exploratory Talk

•

A ‘what could be done’ talk instead of ‘this is how you do it’
What is RabbitMQ
RabbitMQ
RabbitMQ
RabbitMQ
• Multi Protocol Messaging Server
RabbitMQ
• Multi Protocol Messaging Server!
• Open Source (MPL)
RabbitMQ
• Multi Protocol Messaging Server!
• Open Source (MPL)!
• Polyglot
RabbitMQ
• Multi Protocol Messaging Server!
• Open Source (MPL)!
• Polyglot!
• Written in Erlang/OTP
Multi Protocol

http://bit.ly/rmq-protocols
Polyglot
Polyglot
Polyglot
• Java
Polyglot
• Java!
• node.js
Polyglot
• Java!
• node.js!
• Erlang
Polyglot
• Java!
• node.js!
• Erlang!
• PHP
Polyglot
• Java!
• node.js!
• Erlang!
• PHP!
• Ruby
Polyglot
• Java!
• node.js!
• Erlang!
• PHP!
• Ruby!
• .Net
Polyglot
• Java!
• node.js!
• Erlang!
• PHP!
• Ruby!
• .Net!
• Haskell
Polyglot

Even COBOL!!!11
Some users of RabbitMQ
Some users of RabbitMQ
•

Instagram
Some users of RabbitMQ
•
•

Instagram!
Indeed.com
Some users of RabbitMQ
•
•
•

Instagram!
Indeed.com!
Telefonica
Some users of RabbitMQ
•
•
•
•

Instagram!
Indeed.com!
Telefonica!
Mercado Libre
Some users of RabbitMQ
•
•
•
•
•

Instagram!
Indeed.com!
Telefonica!
Mercado Libre!
NHS
Some users of RabbitMQ
•
•
•
•
•
•

Instagram!
Indeed.com!
Telefonica!
Mercado Libre!
NHS!
Mozilla
http://www.rabbitmq.com/download.html

Unix - Mac - Windows
Messaging with RabbitMQ
A demo with the RabbitMQ Simulator

https://github.com/RabbitMQSimulator/RabbitMQSimulator
http://tryrabbitmq.com
RabbitMQ Simulator
What you get out of the box
Some RabbitMQ Features
Some RabbitMQ Features
•

No message loss
Some RabbitMQ Features
•

No message loss

•

Persistent Messages
Some RabbitMQ Features
•

No message loss

•

Persistent Messages

•

Publisher Confirms
Some RabbitMQ Features
•

No message loss

•

Persistent Messages

•

Publisher Confirms

•

Message Acknowledgment
Some RabbitMQ Features
•

No message loss

•

Persistent Messages

•

Publisher Confirms

•

Message Acknowledgment

•

Mirrored Queues
Some RabbitMQ Features
•

No message loss

•

Persistent Messages

•

Publisher Confirms

•

Message Acknowledgment

•

Mirrored Queues

•

Message Ordering
Some RabbitMQ Features
Some RabbitMQ Features
•

Dead Letter Exchanges
Some RabbitMQ Features
•

Dead Letter Exchanges

•

Alternate Exchanges
Some RabbitMQ Features
•

Dead Letter Exchanges

•

Alternate Exchanges

•

Message and Queues TTLs
Some RabbitMQ Features
•

Dead Letter Exchanges

•

Alternate Exchanges

•

Message and Queues TTLs

•

Consumer Priorities
Some RabbitMQ Features
•

Dead Letter Exchanges

•

Alternate Exchanges

•

Message and Queues TTLs

•

Consumer Priorities

•

Federation
Some RabbitMQ Features
•

Dead Letter Exchanges

•

Alternate Exchanges

•

Message and Queues TTLs

•

Consumer Priorities

•

Federation

•

Shovel
Preventing unbounded
buffers with RabbitMQ
http://bit.ly/1eCKYK8
RabbitMQ Management
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: info, warning and error
Requirements
•

Several Web Servers

•

Logic Separated by Module/Action

•

Several Log Levels: info, warning and 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');
Distributed Apps
Distributed Application
App

App

App

App
Distributed Application
App

App

App

App
Ad-hoc solution
A process that replicates data
to the remote server
Possible issues
•

Remote server is offline
•
•

•

Prevent unbounded local buffers
Prevent message loss

Prevent unnecessary message replication
•

No need for those messages on remote server

•

Messages that became stale
Can we do better?
RabbitMQ Federation
RabbitMQ Federation
•

Supports replication across different administrative domains

•

Supports mix of Erlang and RabbitMQ versions

•

Supports Network Partitions

•

Specificity - not everything has to be federated
RabbitMQ Federation
RabbitMQ Federation
RabbitMQ Federation
RabbitMQ Federation
•

It’s a RabbitMQ Plugin
RabbitMQ Federation
•

It’s a RabbitMQ Plugin

•

Internally uses Queues and Exchanges Decorators
RabbitMQ Federation
•

It’s a RabbitMQ Plugin

•

Internally uses Queues and Exchanges Decorators

•

Managed using Parameters and Policies
Enabling the Plugin
rabbitmq-plugins enable rabbitmq_federation
Enabling the Plugin
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management
Federating an Exchange
rabbitmqctl set_parameter federation-upstream my-upstream 
‘{“uri":"amqp://server-name","expires":3600000}'
Federating an Exchange
rabbitmqctl set_parameter federation-upstream my-upstream 
‘{“uri":"amqp://server-name","expires":3600000}'
!

rabbitmqctl set_policy --apply-to exchanges federate-me "^amq." 
'{"federation-upstream-set":"all"}'
Federating an Exchange
With RabbitMQ we can
With RabbitMQ we can
•

Ingest data using various protocols: AMQP, MQTT and STOMP
With RabbitMQ we can
•

Ingest data using various protocols: AMQP, MQTT and STOMP

•

Distribute that data globally using Federation
With RabbitMQ we can
•

Ingest data using various protocols: AMQP, MQTT and STOMP

•

Distribute that data globally using Federation

•

Scale up using with different consumer strategies
With RabbitMQ we can
•

Ingest data using various protocols: AMQP, MQTT and STOMP

•

Distribute that data globally using Federation

•

Scale up using with different consumer strategies

•

Integrate across many platforms and programming languages
Questions?
Talk and Slides

https://joind.in/talk/view/10525
Thanks
Alvaro Videla - @old_sound

Credits
world map: wikipedia.org
federation diagrams: rabbitmq.com

More Related Content

PDF
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
PDF
RabbitMQ Data Ingestion
PDF
Dissecting the rabbit: RabbitMQ Internal Architecture
PPTX
Spring RabbitMQ
PDF
Alvaro Videla, Building a Distributed Data Ingestion System with RabbitMQ
PDF
PDF
Practical Message Queuing Using RabbitMQ (PHPem, 3rd July 2014)
PDF
RabbitMQ with python and ruby RuPy 2009
Architecture | The Future of Messaging: RabbitMQ and AMQP | Eberhard Wolff
RabbitMQ Data Ingestion
Dissecting the rabbit: RabbitMQ Internal Architecture
Spring RabbitMQ
Alvaro Videla, Building a Distributed Data Ingestion System with RabbitMQ
Practical Message Queuing Using RabbitMQ (PHPem, 3rd July 2014)
RabbitMQ with python and ruby RuPy 2009

What's hot (20)

PDF
The Future of Messaging: RabbitMQ and AMQP
PPTX
Scaling application with RabbitMQ
PPTX
High powered messaging with RabbitMQ
PDF
Troubleshooting RabbitMQ and services that use it
PDF
RabbitMQ Operations
PPTX
RabbitMQ Model and Some Example Applications
PDF
Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...
PDF
Rabbitmq, amqp Intro - Messaging Patterns
PDF
Messaging Standards and Systems - AMQP & RabbitMQ
PDF
Messaging with RabbitMQ and AMQP
PDF
Improvements in RabbitMQ
PDF
RabbitMQ Data Ingestion at Craft Conf
PPTX
The RabbitMQ Message Broker
PPTX
RabbitMQ vs Apache Kafka Part II Webinar
PDF
RabbitMQ fairly-indepth
PPTX
Spring RabbitMQ
PDF
Introduction to AMQP Messaging with RabbitMQ
PDF
Distributed messaging with AMQP
PDF
%w(map reduce).first - A Tale About Rabbits, Latency, and Slim Crontabs
PDF
Messaging with amqp and rabbitmq
The Future of Messaging: RabbitMQ and AMQP
Scaling application with RabbitMQ
High powered messaging with RabbitMQ
Troubleshooting RabbitMQ and services that use it
RabbitMQ Operations
RabbitMQ Model and Some Example Applications
Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...
Rabbitmq, amqp Intro - Messaging Patterns
Messaging Standards and Systems - AMQP & RabbitMQ
Messaging with RabbitMQ and AMQP
Improvements in RabbitMQ
RabbitMQ Data Ingestion at Craft Conf
The RabbitMQ Message Broker
RabbitMQ vs Apache Kafka Part II Webinar
RabbitMQ fairly-indepth
Spring RabbitMQ
Introduction to AMQP Messaging with RabbitMQ
Distributed messaging with AMQP
%w(map reduce).first - A Tale About Rabbits, Latency, and Slim Crontabs
Messaging with amqp and rabbitmq
Ad

Viewers also liked (20)

PPTX
Software Architectures, Week 4 - Message-based Architectures, Message Bus
PDF
Juc boston2014.pptx
PDF
Theres a rabbit on my symfony
KEY
Telephony with OpenShift Twilio and MongoDB
KEY
Taste Rabbitmq
PDF
新浪微博开放平台Redis实战
PPTX
高性能No sql数据库redis
PDF
Working with Asynchronous Events
PDF
redis 适用场景与实现
PPTX
Redis介绍
PDF
Introduction to RabbitMQ | Meetup at Pivotal Labs
PDF
RabbitMQ Messaging
PPTX
OWASP Ireland June Chapter Meeting - Paul Mooney on ARMOR & CSRF
KEY
Event Driven Architecture
PPTX
Sophos Day Belgium - This is Next-Gen IT Security (Sophos Intercept X)
PDF
Asynchronous processing with PHP and Symfony2. Do it simple
PDF
Integrating RabbitMQ with PHP
PDF
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
PDF
Interoperability With RabbitMq
PDF
深入了解Redis
Software Architectures, Week 4 - Message-based Architectures, Message Bus
Juc boston2014.pptx
Theres a rabbit on my symfony
Telephony with OpenShift Twilio and MongoDB
Taste Rabbitmq
新浪微博开放平台Redis实战
高性能No sql数据库redis
Working with Asynchronous Events
redis 适用场景与实现
Redis介绍
Introduction to RabbitMQ | Meetup at Pivotal Labs
RabbitMQ Messaging
OWASP Ireland June Chapter Meeting - Paul Mooney on ARMOR & CSRF
Event Driven Architecture
Sophos Day Belgium - This is Next-Gen IT Security (Sophos Intercept X)
Asynchronous processing with PHP and Symfony2. Do it simple
Integrating RabbitMQ with PHP
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Interoperability With RabbitMq
深入了解Redis
Ad

Similar to Scaling applications with RabbitMQ at SunshinePHP (20)

PDF
Scaling Web Apps With RabbitMQ - Erlang Factory Lite
PDF
Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Vid...
PDF
Adding 1.21 Gigawatts to Applications with RabbitMQ (PHPNW Dec 2014 Meetup)
PDF
Reducing load with RabbitMQ
PDF
Messaging Standards and Systems - AMQP & RabbitMQ
PDF
RabbitMQ in PHP
PDF
IRJET- Development of Android Application for Device to Device Communication ...
PDF
What RabbitMQ can do for you (phpnw14 Uncon)
PPTX
RabbitMQ and AMQP with .net client library
PDF
Integrating php withrabbitmq_zendcon
PPTX
Rabbit MQ
PDF
Enterprise Messaging with RabbitMQ.pdf
PDF
Follow the White Rabbit - Message Queues with PHP
PPTX
RabbitMQ and AMQP Model
PDF
Multi-platform Enterprise Messaging with RabbitMQ
PDF
Keynote: Idiomatic RabbitMQ - Gavin M Roy
PPT
Easy enterprise application integration with RabbitMQ and AMQP
PDF
Adding 1.21 Gigawatts to Applications with RabbitMQ (DPC 2015)
PDF
Get Started with RabbitMQ (CoderCruise 2017)
PPTX
FEUC Tec 2016 - Desacoplando WorkFlows com RabbitMQ
Scaling Web Apps With RabbitMQ - Erlang Factory Lite
Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Vid...
Adding 1.21 Gigawatts to Applications with RabbitMQ (PHPNW Dec 2014 Meetup)
Reducing load with RabbitMQ
Messaging Standards and Systems - AMQP & RabbitMQ
RabbitMQ in PHP
IRJET- Development of Android Application for Device to Device Communication ...
What RabbitMQ can do for you (phpnw14 Uncon)
RabbitMQ and AMQP with .net client library
Integrating php withrabbitmq_zendcon
Rabbit MQ
Enterprise Messaging with RabbitMQ.pdf
Follow the White Rabbit - Message Queues with PHP
RabbitMQ and AMQP Model
Multi-platform Enterprise Messaging with RabbitMQ
Keynote: Idiomatic RabbitMQ - Gavin M Roy
Easy enterprise application integration with RabbitMQ and AMQP
Adding 1.21 Gigawatts to Applications with RabbitMQ (DPC 2015)
Get Started with RabbitMQ (CoderCruise 2017)
FEUC Tec 2016 - Desacoplando WorkFlows com RabbitMQ

More from Alvaro Videla (15)

PDF
Data Migration at Scale with RabbitMQ and Spring Integration
PDF
Unit Test + Functional Programming = Love
PDF
Writing testable code
PDF
RabbitMQ Hands On
PDF
Rabbitmq Boot System
PDF
Cloud Foundry Bootcamp
PDF
Cloud Messaging With Cloud Foundry
PDF
Taming the rabbit
PDF
PDF
Código Fácil De Testear
PDF
Desacoplando aplicaciones
PDF
Messaging patterns
PDF
Scaling webappswithrabbitmq
PDF
Integrating Erlang with PHP
PDF
Debugging and Profiling Symfony Apps
Data Migration at Scale with RabbitMQ and Spring Integration
Unit Test + Functional Programming = Love
Writing testable code
RabbitMQ Hands On
Rabbitmq Boot System
Cloud Foundry Bootcamp
Cloud Messaging With Cloud Foundry
Taming the rabbit
Código Fácil De Testear
Desacoplando aplicaciones
Messaging patterns
Scaling webappswithrabbitmq
Integrating Erlang with PHP
Debugging and Profiling Symfony Apps

Recently uploaded (20)

PDF
Electronic commerce courselecture one. Pdf
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Spectral efficient network and resource selection model in 5G networks
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
KodekX | Application Modernization Development
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Cloud computing and distributed systems.
Electronic commerce courselecture one. Pdf
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Dropbox Q2 2025 Financial Results & Investor Presentation
Spectral efficient network and resource selection model in 5G networks
“AI and Expert System Decision Support & Business Intelligence Systems”
Digital-Transformation-Roadmap-for-Companies.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
NewMind AI Weekly Chronicles - August'25 Week I
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Empathic Computing: Creating Shared Understanding
NewMind AI Monthly Chronicles - July 2025
Network Security Unit 5.pdf for BCA BBA.
CIFDAQ's Market Insight: SEC Turns Pro Crypto
KodekX | Application Modernization Development
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Diabetes mellitus diagnosis method based random forest with bat algorithm
Mobile App Security Testing_ A Comprehensive Guide.pdf
Cloud computing and distributed systems.

Scaling applications with RabbitMQ at SunshinePHP