Introduction to RabbitMQ | Meetup at Pivotal Labs
-
Upload
alvaro-videla -
Category
Technology
-
view
122 -
download
3
description
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 | [email protected]/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
Multi Protocol
http://bit.ly/rmq-protocols
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
Friday, September 13, 13
Some users of RabbitMQ
• Indeed.com
Friday, September 13, 13
Some users of RabbitMQ
• Indeed.com
• MailboxApp
Friday, September 13, 13
Some users of RabbitMQ
• 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