RabbitMQ Hands On

74
RabbitMQ Hands On Álvaro Videla - VMware Monday, February 25, 13

description

Talk given at PHPUK 13. The Pub/Sub Pattern image form slide 51 is taken from here: http://www.eaipatterns.com/PublishSubscribeChannel.html

Transcript of RabbitMQ Hands On

Page 1: RabbitMQ Hands On

RabbitMQ Hands On

Álvaro Videla - VMware

Monday, February 25, 13

Page 2: RabbitMQ Hands On

About Me• Developer Advocate for Cloud Foundry

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

• Twitter: @old_sound

Monday, February 25, 13

Page 3: RabbitMQ Hands On

About Me• Developer Advocate for Cloud Foundry

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

• Twitter: @old_sound

• I created gifsockets™

Monday, February 25, 13

Page 4: RabbitMQ Hands On

About Me

Co-authored

RabbitMQ in Action

http://bit.ly/rabbitmq

Monday, February 25, 13

Page 5: RabbitMQ Hands On

Why do you need messaging?

Monday, February 25, 13

Page 6: RabbitMQ Hands On

Classic Web Apps

Monday, February 25, 13

Page 7: RabbitMQ Hands On

Implement a Photo Gallery

Monday, February 25, 13

Page 8: RabbitMQ Hands On

Two Parts:

Monday, February 25, 13

Page 9: RabbitMQ Hands On

Pretty Simple

Monday, February 25, 13

Page 10: RabbitMQ Hands On

‘Till new requirements arrive

Monday, February 25, 13

Page 11: RabbitMQ Hands On

The Product Owner

Monday, February 25, 13

Page 12: RabbitMQ Hands On

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

Monday, February 25, 13

Page 13: RabbitMQ Hands On

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

I forgot to mention we need it for tomorrow…

Monday, February 25, 13

Page 14: RabbitMQ Hands On

Monday, February 25, 13

Page 15: RabbitMQ Hands On

The Social Media Guru

Monday, February 25, 13

Page 16: RabbitMQ Hands On

We need to give badges to users for each picture upload

Monday, February 25, 13

Page 17: RabbitMQ Hands On

We need to give badges to users for each picture upload

and post uploads to Twitter

Monday, February 25, 13

Page 18: RabbitMQ Hands On

Monday, February 25, 13

Page 19: RabbitMQ Hands On

The Sysadmin

Monday, February 25, 13

Page 20: RabbitMQ Hands On

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

Monday, February 25, 13

Page 21: RabbitMQ Hands On

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

We need this fixed for yesterday!

Monday, February 25, 13

Page 22: RabbitMQ Hands On

Monday, February 25, 13

Page 23: RabbitMQ Hands On

The Developer in the other team

Monday, February 25, 13

Page 24: RabbitMQ Hands On

I need to call your PHP stuff but from Python

Monday, February 25, 13

Page 25: RabbitMQ Hands On

I need to call your PHP stuff but from Python

And also Java starting next week

Monday, February 25, 13

Page 26: RabbitMQ Hands On

Monday, February 25, 13

Page 27: RabbitMQ Hands On

The User

Monday, February 25, 13

Page 28: RabbitMQ Hands On

I don’t want to waittill your app resizes

my image!

Monday, February 25, 13

Page 29: RabbitMQ Hands On

You

Monday, February 25, 13

Page 30: RabbitMQ Hands On

Monday, February 25, 13

Page 31: RabbitMQ Hands On

Let’s see the code evolution

Monday, February 25, 13

Page 32: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.

Pseudo Code

Comments

Monday, February 25, 13

Page 33: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.

Pseudo Code

Function Name

Monday, February 25, 13

Page 34: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.

Pseudo Code

Arguments

Monday, February 25, 13

Page 35: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.

Pseudo Code

Function Body

Monday, February 25, 13

Page 36: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.

Pseudo Code

Return Value

Monday, February 25, 13

Page 37: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.

First Implementation:

Monday, February 25, 13

Page 38: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> {ok, Image} = image_handler:do_upload(ReqData:get_file()), resize_image(Image),ok.

Second Implementation:

Monday, February 25, 13

Page 39: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> {ok, Image} = image_handler:do_upload(ReqData:get_file()), resize_image(Image),notify_friends(ReqData:get_user()),ok.

Third Implementation:

Monday, February 25, 13

Page 40: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> {ok, Image} = image_handler:do_upload(ReqData:get_file()), resize_image(Image),notify_friends(ReqData:get_user()),add_points_to_user(ReqData:get_user()),ok.

Fourth Implementation:

Monday, February 25, 13

Page 41: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> {ok, Image} = image_handler:do_upload(ReqData:get_file()), resize_image(Image),notify_friends(ReqData:get_user()),add_points_to_user(ReqData:get_user()),tweet_new_image(User, Image),ok.

Final Implementation:

Monday, February 25, 13

Page 42: RabbitMQ Hands On

Can our code scale to new requirements?

Monday, February 25, 13

Page 43: RabbitMQ Hands On

What if

Monday, February 25, 13

Page 44: RabbitMQ Hands On

• We need to speed up image conversion

What if

Monday, February 25, 13

Page 45: RabbitMQ Hands On

• We need to speed up image conversion• User notifications sent by email

What if

Monday, February 25, 13

Page 46: RabbitMQ Hands On

• We need to speed up image conversion• User notifications sent by email• Stop tweeting about new images

What if

Monday, February 25, 13

Page 47: RabbitMQ Hands On

• We need to speed up image conversion• User notifications sent by email• Stop tweeting about new images• Resize in different formats

What if

Monday, February 25, 13

Page 48: RabbitMQ Hands On

• We need to speed up image conversion• User notifications sent by email• Stop tweeting about new images• Resize in different formats• Swap Language / Technology (No Down

Time)

What if

Monday, February 25, 13

Page 49: RabbitMQ Hands On

Can we do better?

Monday, February 25, 13

Page 50: RabbitMQ Hands On

Sure.Using messaging

Monday, February 25, 13

Page 51: RabbitMQ Hands On

DesignPublish / Subscribe Pattern

Monday, February 25, 13

Page 52: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> {ok, Image} = image_handler:do_upload(ReqData:get_file()),Msg = #msg{user = ReqData:get_user(), image = Image},publish_message('new_image', Msg).

First Implementation:

Monday, February 25, 13

Page 53: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> {ok, Image} = image_handler:do_upload(ReqData:get_file()),Msg = #msg{user = ReqData:get_user(), image = Image},publish_message('new_image', Msg).

First Implementation:

%% friends notifieron('new_image', Msg) ->notify_friends(Msg.user, Msg.image).

Monday, February 25, 13

Page 54: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> {ok, Image} = image_handler:do_upload(ReqData:get_file()),Msg = #msg{user = ReqData:get_user(), image = Image},publish_message('new_image', Msg).

First Implementation:

%% friends notifieron('new_image', Msg) ->notify_friends(Msg.user, Msg.image).

%% points manageron('new_image', Msg) ->add_points(Msg.user, 'new_image').

Monday, February 25, 13

Page 55: RabbitMQ Hands On

%% image_controllerhandle('PUT', "/user/image", ReqData) -> {ok, Image} = image_handler:do_upload(ReqData:get_file()),Msg = #msg{user = ReqData:get_user(), image = Image},publish_message('new_image', Msg).

First Implementation:

%% friends notifieron('new_image', Msg) ->notify_friends(Msg.user, Msg.image).

%% points manageron('new_image', Msg) ->add_points(Msg.user, 'new_image').

%% resizeron('new_image', Msg) ->resize_image(Msg.image).

Monday, February 25, 13

Page 56: RabbitMQ Hands On

Second Implementation:

Monday, February 25, 13

Page 57: RabbitMQ Hands On

Second Implementation:

THIS PAGE INTENTIONALLY LEFT BLANK

Monday, February 25, 13

Page 58: RabbitMQ Hands On

Monday, February 25, 13

Page 59: RabbitMQ Hands On

Messaging and RabbitMQ

Monday, February 25, 13

Page 60: RabbitMQ Hands On

RabbitMQ

Monday, February 25, 13

Page 61: RabbitMQ Hands On

RabbitMQ

• Multi Protocol Messaging Server

Monday, February 25, 13

Page 62: RabbitMQ Hands On

RabbitMQ

• Multi Protocol Messaging Server• Open Source (MPL)

Monday, February 25, 13

Page 63: RabbitMQ Hands On

RabbitMQ

• Multi Protocol Messaging Server• Open Source (MPL)• Part of Spring Source

Monday, February 25, 13

Page 64: RabbitMQ Hands On

RabbitMQ

• Polyglot• Multi Protocol• Open Source (MPL)• Written in Erlang/OTP

Monday, February 25, 13

Page 66: RabbitMQ Hands On

Polyglot

• PHP• node.js• Erlang• Java• Ruby• .Net• Haskell

Monday, February 25, 13

Page 67: RabbitMQ Hands On

TELL ME MORE

Monday, February 25, 13

Page 68: RabbitMQ Hands On

CODE OR IT DIDN’T HAPPEN

http://github.com/videlalvaro/php-amqplib

Monday, February 25, 13

Page 69: RabbitMQ Hands On

Messaging

Monday, February 25, 13

Page 70: RabbitMQ Hands On

Messaging

Scale

Monday, February 25, 13

Page 71: RabbitMQ Hands On

Messaging

DecouplingScale

Monday, February 25, 13

Page 72: RabbitMQ Hands On

Messaging

DecouplingScale

Polyglot Apps

Monday, February 25, 13

Page 73: RabbitMQ Hands On

Questions?

Monday, February 25, 13

Page 74: RabbitMQ Hands On

Thanks!@old_sound

Monday, February 25, 13