© 2012 VMware, Inc. All rights reserved.
Cloud Messaging with Cloud Foundry
Álvaro Videla - VMware
Tuesday, November 13, 12
About Me
• Developer Advocate for Cloud Foundry• Blog: http://videlalvaro.github.com/• Twitter: @old_sound
2Tuesday, November 13, 12
About Me
• Developer Advocate for Cloud Foundry• Blog: http://videlalvaro.github.com/• Twitter: @old_sound• I created gifsockets™
3Tuesday, November 13, 12
About Me
Co-authored
RabbitMQ in Action
http://bit.ly/rabbitmq
4Tuesday, November 13, 12
Classic Apps
5Tuesday, November 13, 12
Implement a Photo Gallery
Tuesday, November 13, 12
Two Parts:
Tuesday, November 13, 12
Pretty Simple
Tuesday, November 13, 12
‘Till new requirements arrive
Tuesday, November 13, 12
The Product Owner
Tuesday, November 13, 12
Can we also notify the user friends when she uploads a new image?
Tuesday, November 13, 12
Can we also notify the user friends when she uploads a new image?
I forgot to mention we need it for tomorrow…
Tuesday, November 13, 12
Tuesday, November 13, 12
The Social Media Guru
Tuesday, November 13, 12
We need to give badges to users for each picture upload
Tuesday, November 13, 12
We need to give badges to users for each picture upload
and post uploads to Twitter
Tuesday, November 13, 12
Tuesday, November 13, 12
The Sysadmin
Tuesday, November 13, 12
Dumb! You’re delivering full size images!
The bandwidth bill has tripled!
Tuesday, November 13, 12
Dumb! You’re delivering full size images!
The bandwidth bill has tripled!
We need this fixed for yesterday!
Tuesday, November 13, 12
Tuesday, November 13, 12
The Developer in the other team
Tuesday, November 13, 12
I need to call your PHP stuff but from Python
Tuesday, November 13, 12
I need to call your PHP stuff but from Python
And also Java starting next week
Tuesday, November 13, 12
Tuesday, November 13, 12
The User
Tuesday, November 13, 12
I don’t want to waittill your app resizes
my image!
Tuesday, November 13, 12
You
Tuesday, November 13, 12
Tuesday, November 13, 12
Let’s see the code evolution
30Tuesday, November 13, 12
%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.
Pseudo Code
Comments
Tuesday, November 13, 12
%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.
Pseudo Code
Function Name
Tuesday, November 13, 12
%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.
Pseudo Code
Arguments
Tuesday, November 13, 12
%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.
Pseudo Code
Function Body
Tuesday, November 13, 12
%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.
Pseudo Code
Return Value
Tuesday, November 13, 12
%% image_controllerhandle('PUT', "/user/image", ReqData) -> image_handler:do_upload(ReqData:get_file()), ok.
First Implementation:
Tuesday, November 13, 12
%% image_controllerhandle('PUT', "/user/image", ReqData) -> {ok, Image} = image_handler:do_upload(ReqData:get_file()), resize_image(Image),ok.
Second Implementation:
Tuesday, November 13, 12
%% 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:
Tuesday, November 13, 12
%% 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:
Tuesday, November 13, 12
%% 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:
Tuesday, November 13, 12
Can our code scale to new requirements?
41Tuesday, November 13, 12
What if
42Tuesday, November 13, 12
What if
• We need to speed up image conversion
43Tuesday, November 13, 12
What if
• We need to speed up image conversion• User notification has to be sent by email
44Tuesday, November 13, 12
What if
• We need to speed up image conversion• User notification has to be sent by email• Stop tweeting about new images
45Tuesday, November 13, 12
What if
• We need to speed up image conversion• User notification has to be sent by email• Stop tweeting about new images• Resize in different formats
46Tuesday, November 13, 12
What if
• We need to speed up image conversion• User notification has to be sent by email• Stop tweeting about new images• Resize in different formats• Swap Language / Technology
47Tuesday, November 13, 12
What if
• We need to speed up image conversion• User notification has to be sent by email• Stop tweeting about new images• Resize in different formats• Swap Language / Technology (No Down Time)
48Tuesday, November 13, 12
Can we do better?
49Tuesday, November 13, 12
Sure. Using messaging
50Tuesday, November 13, 12
DesignPublish / Subscribe Pattern
Tuesday, November 13, 12
%% 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:
Tuesday, November 13, 12
%% 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).
Tuesday, November 13, 12
%% 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').
Tuesday, November 13, 12
%% 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).
Tuesday, November 13, 12
Second Implementation:
Tuesday, November 13, 12
Second Implementation:
THIS PAGE INTENTIONALLY LEFT BLANK
Tuesday, November 13, 12
Tuesday, November 13, 12
Messaging
59Tuesday, November 13, 12
Messaging
• Share data across processes
60Tuesday, November 13, 12
Messaging
• Share data across processes• Processes can be part of different apps
61Tuesday, November 13, 12
Messaging
• Share data across processes• Processes can be part of different apps• Apps can live in different machines
62Tuesday, November 13, 12
Messaging
• Share data across processes• Processes can be part of different apps• Apps can live in different machines• Communication is Asynchronous
63Tuesday, November 13, 12
Main Concepts
64Tuesday, November 13, 12
Main Concepts
• Messages are sent by Producers
65Tuesday, November 13, 12
Main Concepts
• Messages are sent by Producers• Messages are delivered to Consumers
66Tuesday, November 13, 12
How can we start using messaging
today?
67Tuesday, November 13, 12
Enter
68Tuesday, November 13, 12
Why Cloud Foundry is Good™
for Messaging?
69Tuesday, November 13, 12
Key aspects of Cloud Foundry
70Tuesday, November 13, 12
Key aspects of Cloud Foundry
71
• Supports many apps per account
Tuesday, November 13, 12
Key aspects of Cloud Foundry
72
• Supports many apps per account• Supports many services per account
Tuesday, November 13, 12
Key aspects of Cloud Foundry
73
• Supports many apps per account• Supports many services per account• Services can be shared across apps
Tuesday, November 13, 12
Key aspects of Cloud Foundry
74
• Supports many apps per account• Supports many services per account• Services can be shared across apps• Supports RabbitMQ by default
Tuesday, November 13, 12
Intermission:
75
What is RabbitMQ
Tuesday, November 13, 12
RabbitMQ
76Tuesday, November 13, 12
RabbitMQ
• Multi Protocol Messaging Server
77Tuesday, November 13, 12
RabbitMQ
• Multi Protocol Messaging Server• Open Source (MPL)
78Tuesday, November 13, 12
RabbitMQ
• Multi Protocol Messaging Server• Open Source (MPL)• Part of Spring Source
79Tuesday, November 13, 12
RabbitMQ
• Multi Protocol Messaging Server• Open Source (MPL)• Part of Spring Source• Supports AMQP, STOMP, MQTT
80Tuesday, November 13, 12
RabbitMQ
• Multi Protocol Messaging Server• Open Source (MPL)• Part of Spring Source• Supports AMQP, STOMP, MQTT• Has Clients for Many Platforms: Java, Ruby, node.js, PHP,
Erlang, .Net., more
81Tuesday, November 13, 12
TELL ME MORE
82Tuesday, November 13, 12
TELL ME MORE
83
RabbitMQ Simulator Demo
Tuesday, November 13, 12
Sample App: CloudStagram
84Tuesday, November 13, 12
Sample App: CloudStagram
85Tuesday, November 13, 12
Sample App: CloudStagram
86Tuesday, November 13, 12
Sample App: CloudStagram
87Tuesday, November 13, 12
Sample App: CloudStagram
88Tuesday, November 13, 12
Sample App: CloudStagram
89Tuesday, November 13, 12
Sample App: CloudStagram
90Tuesday, November 13, 12
Sample App: CloudStagram
91
Frontend Appnode.js
Tuesday, November 13, 12
Sample App: CloudStagram
92
Frontend Appnode.js
Image Resizersnode.js
Tuesday, November 13, 12
Sample App: CloudStagram
93
Frontend Appnode.js
Image ResizersClojure
Tuesday, November 13, 12
CODE OR IT DIDN’T HAPPEN
94Tuesday, November 13, 12
CODA
95Tuesday, November 13, 12
Messaging
96Tuesday, November 13, 12
Messaging
97
Scale
Tuesday, November 13, 12
Messaging
98
Scale Decoupling
Tuesday, November 13, 12
Messaging
99
Scale Decoupling
Polyglot
Tuesday, November 13, 12
100Tuesday, November 13, 12
101
HeavyLifting
Tuesday, November 13, 12
102
HeavyLifting
MultiApps
Tuesday, November 13, 12
103
HeavyLifting
MultiApps
MultiServices
Tuesday, November 13, 12
104
HeavyLifting
Cloud Messaging
MultiApps
MultiServices
Tuesday, November 13, 12
Sign Up Today
105
https://my.cloudfoundry.com/signup
Tuesday, November 13, 12
Questions?
106Tuesday, November 13, 12
107
Thanks!Álvaro Videla
http://twitter.com/old_sound
http://github.com/videlalvaro
http://www.slideshare.net/old_sound
Tuesday, November 13, 12