+ All Categories
Home > Technology > Theres a rabbit on my symfony

Theres a rabbit on my symfony

Date post: 11-May-2015
Category:
Upload: alvaro-videla
View: 18,401 times
Download: 3 times
Share this document with a friend
Description:
Talk given at Symfony Live Paris 2011 http://www.symfony-live.com/paris/schedule#session-av1
Popular Tags:
144
There's a Rabbit on my Symfony Álvaro Videla Symfony Live 2011 RabbitMQ and Symfony2 Integration Thursday, March 3, 2011
Transcript
Page 1: Theres a rabbit on my symfony

There's a Rabbit on my Symfony

Álvaro Videla

Symfony Live 2011

RabbitMQ and Symfony2 Integration

Thursday, March 3, 2011

Page 2: Theres a rabbit on my symfony

Who?

Thursday, March 3, 2011

Page 3: Theres a rabbit on my symfony

About Me

• Development Manager at TheNetCircle.com

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

• Twitter: @old_sound

Thursday, March 3, 2011

Page 4: Theres a rabbit on my symfony

About Me

• Developer at Liip

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

• Twitter: @old_sound

Thursday, March 3, 2011

Page 5: Theres a rabbit on my symfony

About Me

Co-authoring

RabbitMQ in Action

http://bit.ly/rabbitmq

Thursday, March 3, 2011

Page 6: Theres a rabbit on my symfony

Why Do I need RabbitMQ?

Thursday, March 3, 2011

Page 7: Theres a rabbit on my symfony

Or

Thursday, March 3, 2011

Page 8: Theres a rabbit on my symfony

Why Do I need Messaging?

Thursday, March 3, 2011

Page 9: Theres a rabbit on my symfony

An Upload PictureForm as seen by:

Thursday, March 3, 2011

Page 10: Theres a rabbit on my symfony

The User

Thursday, March 3, 2011

Page 11: Theres a rabbit on my symfony

I don’t want to waittill your app resizes

my image!

Thursday, March 3, 2011

Page 12: Theres a rabbit on my symfony

The Product Owner

Thursday, March 3, 2011

Page 13: Theres a rabbit on my symfony

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

Thursday, March 3, 2011

Page 14: Theres a rabbit on my symfony

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

I forgot to mention we need it for tomorrow…

Thursday, March 3, 2011

Page 15: Theres a rabbit on my symfony

The Sysadmin

Thursday, March 3, 2011

Page 16: Theres a rabbit on my symfony

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

Thursday, March 3, 2011

Page 17: Theres a rabbit on my symfony

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

We need this fixed for yesterday!

Thursday, March 3, 2011

Page 18: Theres a rabbit on my symfony

The Developer in the other team

Thursday, March 3, 2011

Page 19: Theres a rabbit on my symfony

I need to call your PHP stuff but from Python

Thursday, March 3, 2011

Page 20: Theres a rabbit on my symfony

I need to call your PHP stuff but from Python

And also Java starting next week

Thursday, March 3, 2011

Page 21: Theres a rabbit on my symfony

You

Thursday, March 3, 2011

Page 22: Theres a rabbit on my symfony

FML!

Thursday, March 3, 2011

Page 23: Theres a rabbit on my symfony

Is there a solution?

Thursday, March 3, 2011

Page 24: Theres a rabbit on my symfony

RabbitMQ & AMQP

Thursday, March 3, 2011

Page 25: Theres a rabbit on my symfony

AMQP

Thursday, March 3, 2011

Page 26: Theres a rabbit on my symfony

AMQP

• Advanced Message Queuing Protocol

• Suits Interoperability

• Completely Open Protocol

• Binary Protocol

• AMQP Model

• AMQP Wire Format

Thursday, March 3, 2011

Page 27: Theres a rabbit on my symfony

AMQP Model

• Exchanges

• Message Queues

• Bindings

• Rules for binding them

Thursday, March 3, 2011

Page 28: Theres a rabbit on my symfony

AMQP Wire Protocol

• Functional Layer

• Transport Layer

Thursday, March 3, 2011

Page 29: Theres a rabbit on my symfony

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, March 3, 2011

Page 30: Theres a rabbit on my symfony

Exchange Types

• Fanout

• Direct

• Topic

Thursday, March 3, 2011

Page 34: Theres a rabbit on my symfony

Usage Scenarios

Thursday, March 3, 2011

Page 35: Theres a rabbit on my symfony

Usage Scenarios

• Batch Processing

Thursday, March 3, 2011

Page 36: Theres a rabbit on my symfony

Usage Scenarios

• Batch Processing

• Image Uploading

Thursday, March 3, 2011

Page 37: Theres a rabbit on my symfony

Usage Scenarios

• Batch Processing

• Image Uploading

• Distributed Logging

Thursday, March 3, 2011

Page 38: Theres a rabbit on my symfony

Scenario

Batch Processing

Thursday, March 3, 2011

Page 39: Theres a rabbit on my symfony

Requirements

Thursday, March 3, 2011

Page 40: Theres a rabbit on my symfony

Requirements

• Generate XML

Thursday, March 3, 2011

Page 41: Theres a rabbit on my symfony

Requirements

• Generate XML

• Distribution Over a Cluster

Thursday, March 3, 2011

Page 42: Theres a rabbit on my symfony

Requirements

• Generate XML

• Distribution Over a Cluster

• Elasticity - Add/Remove new workers

Thursday, March 3, 2011

Page 43: Theres a rabbit on my symfony

Requirements

• Generate XML

• Distribution Over a Cluster

• Elasticity - Add/Remove new workers

• No Code Changes

Thursday, March 3, 2011

Page 44: Theres a rabbit on my symfony

Design

Thursday, March 3, 2011

Page 45: Theres a rabbit on my symfony

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, March 3, 2011

Page 46: Theres a rabbit on my symfony

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, March 3, 2011

Page 47: Theres a rabbit on my symfony

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, March 3, 2011

Page 48: Theres a rabbit on my symfony

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, March 3, 2011

Page 49: Theres a rabbit on my symfony

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, March 3, 2011

Page 50: Theres a rabbit on my symfony

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, March 3, 2011

Page 51: Theres a rabbit on my symfony

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, March 3, 2011

Page 52: Theres a rabbit on my symfony

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, March 3, 2011

Page 53: Theres a rabbit on my symfony

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, March 3, 2011

Page 54: Theres a rabbit on my symfony

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, March 3, 2011

Page 55: Theres a rabbit on my symfony

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, March 3, 2011

Page 56: Theres a rabbit on my symfony

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, March 3, 2011

Page 57: Theres a rabbit on my symfony

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, March 3, 2011

Page 58: Theres a rabbit on my symfony

Scenario

Upload Pictures

Thursday, March 3, 2011

Page 59: Theres a rabbit on my symfony

Requirements

Thursday, March 3, 2011

Page 60: Theres a rabbit on my symfony

Requirements

• Upload Picture

Thursday, March 3, 2011

Page 61: Theres a rabbit on my symfony

Requirements

• Upload Picture

• Reward User

Thursday, March 3, 2011

Page 62: Theres a rabbit on my symfony

Requirements

• Upload Picture

• Reward User

• Notify User Friends

Thursday, March 3, 2011

Page 63: Theres a rabbit on my symfony

Requirements

• Upload Picture

• Reward User

• Notify User Friends

• Resize Picture

Thursday, March 3, 2011

Page 64: Theres a rabbit on my symfony

Requirements

• Upload Picture

• Reward User

• Notify User Friends

• Resize Picture

• No Code Changes

Thursday, March 3, 2011

Page 65: Theres a rabbit on my symfony

Design

Thursday, March 3, 2011

Page 66: Theres a rabbit on my symfony

Design

Thursday, March 3, 2011

Page 67: Theres a rabbit on my symfony

Design

Thursday, March 3, 2011

Page 68: Theres a rabbit on my symfony

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, March 3, 2011

Page 69: Theres a rabbit on my symfony

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, March 3, 2011

Page 70: Theres a rabbit on my symfony

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, March 3, 2011

Page 71: Theres a rabbit on my symfony

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, March 3, 2011

Page 72: Theres a rabbit on my symfony

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, March 3, 2011

Page 73: Theres a rabbit on my symfony

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, March 3, 2011

Page 74: Theres a rabbit on my symfony

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, March 3, 2011

Page 75: Theres a rabbit on my symfony

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, March 3, 2011

Page 76: Theres a rabbit on my symfony

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, March 3, 2011

Page 77: Theres a rabbit on my symfony

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, March 3, 2011

Page 78: Theres a rabbit on my symfony

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, March 3, 2011

Page 79: Theres a rabbit on my symfony

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, March 3, 2011

Page 80: Theres a rabbit on my symfony

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, March 3, 2011

Page 81: Theres a rabbit on my symfony

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, March 3, 2011

Page 82: Theres a rabbit on my symfony

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, March 3, 2011

Page 83: Theres a rabbit on my symfony

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, March 3, 2011

Page 84: Theres a rabbit on my symfony

Scenario

Distributed Logging

Thursday, March 3, 2011

Page 85: Theres a rabbit on my symfony

Requirements

Thursday, March 3, 2011

Page 86: Theres a rabbit on my symfony

Requirements

• Several Web Servers

Thursday, March 3, 2011

Page 87: Theres a rabbit on my symfony

Requirements

• Several Web Servers

• Logic Separated by Module/Action

Thursday, March 3, 2011

Page 88: Theres a rabbit on my symfony

Requirements

• Several Web Servers

• Logic Separated by Module/Action

• Several Log Levels:

Thursday, March 3, 2011

Page 89: Theres a rabbit on my symfony

Requirements

• Several Web Servers

• Logic Separated by Module/Action

• Several Log Levels:

• Info, Warning, Error

Thursday, March 3, 2011

Page 90: Theres a rabbit on my symfony

Requirements

• Several Web Servers

• Logic Separated by Module/Action

• Several Log Levels:

• Info, Warning, Error

• Add/Remove log listeners at will

Thursday, March 3, 2011

Page 91: Theres a rabbit on my symfony

Design

Thursday, March 3, 2011

Page 92: Theres a rabbit on my symfony

Design

Thursday, March 3, 2011

Page 93: Theres a rabbit on my symfony

Design

Thursday, March 3, 2011

Page 94: Theres a rabbit on my symfony

Design

Thursday, March 3, 2011

Page 95: Theres a rabbit on my symfony

Design

Thursday, March 3, 2011

Page 96: Theres a rabbit on my symfony

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, March 3, 2011

Page 97: Theres a rabbit on my symfony

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, March 3, 2011

Page 98: Theres a rabbit on my symfony

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, March 3, 2011

Page 99: Theres a rabbit on my symfony

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, March 3, 2011

Page 100: Theres a rabbit on my symfony

Consumer Code

Get messages sent by host:

server1

Thursday, March 3, 2011

Page 101: Theres a rabbit on my symfony

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, March 3, 2011

Page 102: Theres a rabbit on my symfony

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, March 3, 2011

Page 103: Theres a rabbit on my symfony

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, March 3, 2011

Page 104: Theres a rabbit on my symfony

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, March 3, 2011

Page 105: Theres a rabbit on my symfony

Consumer Code

Get all error messages

Thursday, March 3, 2011

Page 106: Theres a rabbit on my symfony

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, March 3, 2011

Page 107: Theres a rabbit on my symfony

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, March 3, 2011

Page 108: Theres a rabbit on my symfony

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, March 3, 2011

Page 109: Theres a rabbit on my symfony

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, March 3, 2011

Page 110: Theres a rabbit on my symfony

Symfony Integration

Thursday, March 3, 2011

Page 111: Theres a rabbit on my symfony

RabbitMQ Bundle

Thursday, March 3, 2011

Page 112: Theres a rabbit on my symfony

RabbitMQ Bundle

To be easy to use

Goal:

Thursday, March 3, 2011

Page 113: Theres a rabbit on my symfony

RabbitMQ Bundle

$msg = array('user_id' => 1235, 'image_path' => '/path/to/new/pic.png');

$this->get('rabbitmq.upload_picture_producer')-> publish(serialize($msg));

Publish a Message:

Thursday, March 3, 2011

Page 114: Theres a rabbit on my symfony

RabbitMQ Bundle

$ ./app/console_dev rabbitmq:consumer -m 1 upload_picture

Consume a Message:

Thursday, March 3, 2011

Page 115: Theres a rabbit on my symfony

RabbitMQ Bundle

$ ./app/console_dev rabbitmq:consumer -m 50 upload_picture

Consume 50 Messages:

Thursday, March 3, 2011

Page 116: Theres a rabbit on my symfony

RabbitMQ Bundle

$ ./app/console_dev rabbitmq:consumer -m -1 upload_picture

Consume infinite* Messages:

*messages may not be infinite

Thursday, March 3, 2011

Page 117: Theres a rabbit on my symfony

RabbitMQ Bundle

# app/config/config.ymlrabbitmq.config: connections: default: host: 'localhost' port: 5672 user: 'guest' password: 'guest' vhost: '/'

Configuration:

Thursday, March 3, 2011

Page 118: Theres a rabbit on my symfony

RabbitMQ Bundle

# app/config/config.ymlrabbitmq.config: connections:

...producers:

upload_picture: connection: default exchange_options: {name: 'upload-picture',

type: direct}

Configuration:

Thursday, March 3, 2011

Page 119: Theres a rabbit on my symfony

RabbitMQ Bundle

# app/config/config.ymlrabbitmq.config: connections:

... consumers:

upload_picture: connection: default exchange_options: {name: 'upload-picture',

type: direct} queue_options: {name: 'upload-picture'} callback: upload_picture_service

Configuration:

Thursday, March 3, 2011

Page 120: Theres a rabbit on my symfony

RabbitMQ Bundle

public function indexAction($name){ ... $msg = array('user_id' => 1235,

'image_path' => '/path/to/new/pic.png');

$this->get('rabbitmq.upload_picture_producer')->publish(serialize($msg));

...}

Using a Producer:

Thursday, March 3, 2011

Page 121: Theres a rabbit on my symfony

RabbitMQ Bundle

class UploadPictureConsumer extends ContainerAware implements ConsumerInterface{ public function execute($msg) { // Process picture upload. // $msg will be what was published

// from the Controller. }}

Consumer Class:

Thursday, March 3, 2011

Page 122: Theres a rabbit on my symfony

RabbitMQ Bundle

Recap:

Thursday, March 3, 2011

Page 123: Theres a rabbit on my symfony

RabbitMQ Bundle

• Add an entry for the consumer/producer in the configuration.

Recap:

Thursday, March 3, 2011

Page 124: Theres a rabbit on my symfony

RabbitMQ Bundle

• Add an entry for the consumer/producer in the configuration.

• Implement your Callback.

Recap:

Thursday, March 3, 2011

Page 125: Theres a rabbit on my symfony

RabbitMQ Bundle

• Add an entry for the consumer/producer in the configuration.

• Implement your Callback.

• Start the consumer from the CLI.

Recap:

Thursday, March 3, 2011

Page 126: Theres a rabbit on my symfony

RabbitMQ Bundle

• Add an entry for the consumer/producer in the configuration.

• Implement your Callback.

• Start the consumer from the CLI.

• Add code to publish messages.

Recap:

Thursday, March 3, 2011

Page 127: Theres a rabbit on my symfony

RabbitMQ Bundle

There’s more:

Thursday, March 3, 2011

Page 128: Theres a rabbit on my symfony

RabbitMQ Bundle

• RPC clients and servers

There’s more:

Thursday, March 3, 2011

Page 129: Theres a rabbit on my symfony

RabbitMQ Bundle

• RPC clients and servers

• Anonymous consumers

There’s more:

Thursday, March 3, 2011

Page 130: Theres a rabbit on my symfony

RabbitMQ Bundle

• RPC clients and servers

• Anonymous consumers

• Parallel RPC

There’s more:

Thursday, March 3, 2011

Page 131: Theres a rabbit on my symfony

RabbitMQ Bundle

http://github.com/videlalvaro/RabbitMqBundle

Fork it at

Thursday, March 3, 2011

Page 132: Theres a rabbit on my symfony

Why RabbitMQ?

Thursday, March 3, 2011

Page 133: Theres a rabbit on my symfony

RabbitMQ

• Enterprise Messaging System

• Open Source MPL

• Written in Erlang/OTP

• Commercial Support

Thursday, March 3, 2011

Page 134: Theres a rabbit on my symfony

Features

• Reliable and High Scalable

• Easy To install

• Easy To Cluster

• Runs on: Windows, Solaris, Linux, OSX

• AMQP 0.8 - 0.9.1

Thursday, March 3, 2011

Page 135: Theres a rabbit on my symfony

Client Libraries

• Java

• .NET/C#

• Erlang

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

Thursday, March 3, 2011

Page 136: Theres a rabbit on my symfony

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, March 3, 2011

Page 137: Theres a rabbit on my symfony

One Setup for HA

Thursday, March 3, 2011

Page 138: Theres a rabbit on my symfony

Conclusion

Thursday, March 3, 2011

Page 139: Theres a rabbit on my symfony

Conclusion

• Flexibility

Thursday, March 3, 2011

Page 140: Theres a rabbit on my symfony

Conclusion

• Flexibility

• Scalability

Thursday, March 3, 2011

Page 141: Theres a rabbit on my symfony

Conclusion

• Flexibility

• Scalability

• Interoperability

Thursday, March 3, 2011

Page 142: Theres a rabbit on my symfony

Conclusion

• Flexibility

• Scalability

• Interoperability

• Reduce Ops

Thursday, March 3, 2011

Page 143: Theres a rabbit on my symfony

Questions?

Thursday, March 3, 2011

Page 144: Theres a rabbit on my symfony

Thanks!Álvaro Videla

http://twitter.com/old_sound

http://github.com/videlalvaro

http://github.com/tnc

http://www.slideshare.net/old_sound

Thursday, March 3, 2011


Recommended