Introduction to RabbitMQ | Meetup at Pivotal Labs

Post on 27-Jan-2015

123 views 3 download

Tags:

description

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

Transcript of Introduction to RabbitMQ | Meetup at Pivotal Labs

Introduction to RabbitMQ Alvaro Videla - Pivotal / RabbitMQ

Friday, September 13, 13

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 | avidela@gopivotal.comgithub.com/videlalvaro

Friday, September 13, 13

About Me

Co-authored

RabbitMQ in Action

http://bit.ly/rabbitmq

Friday, September 13, 13

Why do we need messaging?

Friday, September 13, 13

Classic Web Apps

Friday, September 13, 13

Implement a Photo Gallery

Friday, September 13, 13

Two Parts:

Friday, September 13, 13

Pretty Simple

Friday, September 13, 13

‘Till new requirements arrive

Friday, September 13, 13

The Product Owner

Friday, September 13, 13

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

image?

Friday, September 13, 13

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

image?

I forgot to mention we need it for tomorrow…

Friday, September 13, 13

The Social Media Guru

Friday, September 13, 13

We need to give badges to users for each picture upload

Friday, September 13, 13

We need to give badges to users for each picture upload

and post uploads to Twitter

Friday, September 13, 13

The Sysadmin

Friday, September 13, 13

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

Friday, September 13, 13

Dumb! You’re delivering full size images!

The bandwidth bill has tripled!

We need this fixed for yesterday!

Friday, September 13, 13

The Developer in the other team

Friday, September 13, 13

I need to call your Java stuff but from Python

Friday, September 13, 13

I need to call your Java stuff but from Python

And also PHP starting next week

Friday, September 13, 13

The User

Friday, September 13, 13

I don’t want to waittill your app resizes

my image!

Friday, September 13, 13

You

Friday, September 13, 13

(╯°□°)╯( ┻━┻

Friday, September 13, 13

Let’s see the code evolution

Friday, September 13, 13

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

Pseudo Code

Comments

Friday, September 13, 13

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

Pseudo Code

Function Name

Friday, September 13, 13

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

Pseudo Code

Arguments

Friday, September 13, 13

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

Pseudo Code

Function Body

Friday, September 13, 13

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

Pseudo Code

Return Value

Friday, September 13, 13

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

First Implementation:

Friday, September 13, 13

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

ok.

Second Implementation:

Friday, September 13, 13

%% 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:

Friday, September 13, 13

%% 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:

Friday, September 13, 13

%% 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:

Friday, September 13, 13

Can our code scale to new requirements?

Friday, September 13, 13

What if

Friday, September 13, 13

• We need to speed up image conversion

What if

Friday, September 13, 13

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

What if

Friday, September 13, 13

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

What if

Friday, September 13, 13

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

What if

Friday, September 13, 13

• 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

Friday, September 13, 13

Can we do better?

Friday, September 13, 13

Sure.Using messaging

Friday, September 13, 13

DesignPublish / Subscribe Pattern

Friday, September 13, 13

%% 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:

Friday, September 13, 13

%% 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).

Friday, September 13, 13

%% 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').

Friday, September 13, 13

%% 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).

Friday, September 13, 13

Second Implementation:

Friday, September 13, 13

Second Implementation:

THIS PAGE INTENTIONALLY LEFT BLANK

Friday, September 13, 13

What is RabbitMQ

Friday, September 13, 13

RabbitMQ

Friday, September 13, 13

RabbitMQ

• Multi Protocol Messaging Server

Friday, September 13, 13

RabbitMQ

• Multi Protocol Messaging Server• Open Source (MPL)

Friday, September 13, 13

RabbitMQ

• Multi Protocol Messaging Server• Open Source (MPL)• Polyglot

Friday, September 13, 13

RabbitMQ

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

Friday, September 13, 13

Polyglot

Friday, September 13, 13

Polyglot

• Java

Friday, September 13, 13

Polyglot

• Java• node.js

Friday, September 13, 13

Polyglot

• Java• node.js• Erlang

Friday, September 13, 13

Polyglot

• Java• node.js• Erlang• PHP

Friday, September 13, 13

Polyglot

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

Friday, September 13, 13

Polyglot

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

Friday, September 13, 13

Polyglot

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

Friday, September 13, 13

Polyglot

Even COBOL!!!11

Friday, September 13, 13

Some users of RabbitMQ

Friday, September 13, 13

Some users of RabbitMQ

• Instagram

Friday, September 13, 13

Some users of RabbitMQ

• Instagram

• Indeed.com

Friday, September 13, 13

Some users of RabbitMQ

• Instagram

• Indeed.com

• MailboxApp

Friday, September 13, 13

Some users of RabbitMQ

• Instagram

• Indeed.com

• MailboxApp

• Mercado Libre

Friday, September 13, 13

Friday, September 13, 13

Messaging with RabbitMQ

A demo with the RabbitMQ Simulator

https://github.com/RabbitMQSimulator/RabbitMQSimulator

Friday, September 13, 13

Thanks

Alvaro Videla - @old_sound

Friday, September 13, 13