Upload
elliando-dias
View
974
Download
0
Tags:
Embed Size (px)
Citation preview
RailsConf Europe 2008
Juggernaut Realtime Rails
Alex MacCaw and Stuart Eccles
RailsConf Europe 2008
Juggernaut Realtime Rails
Alex MacCaw and Stuart Eccles
http://www.madebymany.co.uk/
server push
HTTP
Client Server
HTTP GET/POST
<html/> <script/>
Server Push
Client Server
what is Juggernaut?
HistoryWritten by Alex MacCaw in 2006
Published at http://juggernaut.rubyforge.org/
Latest versions at GitHub just for Edge Rails
MIT License
3 Components
Invisible Flash SWF
Rails PluginJuggernaut
Server
Client Messenger Broadcaster
Juggernaut is also
what do we want?
This guy....
what do we want?
This guy....
X-Men Character
X-Men Character
the other Juggernaut?
real world users
Collaboration
Real Time Interaction
Multiplayer Games
Multiplayer Games
Chat
Real Time Activity Feeds
Enhancing Traditional Media
juggernautcompetition
resource intensive
resource intensive
not
realtime
Firefox memory issues
Firefox memory issues
not
cross-
domain
Firefox memory issues
not
cross-
domain
IE
clicking
Firefox memory issues
not
cross-
domain
IE
clicking
max 2
streams in IE
features browser
compatibilityFlash 8> 95% of all browserscross-OSPrototype and JQuery versions
features scale with
eventmachine30k concurrent usersand clustering support
features channelsclient can subscribe to one or more channelsBroadcast can be channel selectedBroadcast can even be client selected
features authentication
IP whitelistshared secretsauthentication callbacks
features callbacksclient connect callbackclient disconnect callback
features queries
query server for list of clients
in pictures
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
GET
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
OK
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
SUBSCRIBE
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
callback
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
SUBSCRIBE
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEXcallback
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
JSON MESSAGE
RJS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
JS
Wonder-women has entered chat
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
JS
Wonder-women has entered chat
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
AJAX
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
JSON MESSAGE
RJS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
JS
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
JS
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
JS
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
JS
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
SuperMan says ‘Hi!’
SuperMan says ‘Hi!’
SuperMan says ‘Hi!’
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
RAKE
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
RJS
JSON MESSAGE
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
JS
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
JS
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
JS
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
JS
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
Chat will be closing in 10 minutes!
Chat will be closing in 10 minutes!
Chat will be closing in 10 minutes!
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
DUPLEX
notification
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
callback
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
RJS
JSON MESSAGE
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
JS
JS
Rails Application
Juggernaut Rails Plugin
Juggernaut Push Server
DUPLEX
DUPLEX
SuperMan has left the building!
SuperMan has left the building!
Audience Participation
http://railsconf.madebymany.co.uk
def code
Partial Update Example
Install Juggernaut
script/plugin install \
http://juggernaut.rubyforge.org/svn/trunk/juggernaut
sudo gem install juggernaut
(includes json and eventmachine dependencies)
Start the Push Server
juggernaut -g juggernaut.yml
juggernaut -c juggernaut.yml
<%= juggernaut %>
View
<%= javascript_include_tag :defaults,
:juggernaut %>
<html>
<head>
</head>
Controller
render :juggernaut do |page|
page.replace 'person-45',
:partial => 'person'
end
That’s it!
Demo 1: Chat
Subscribe to channels
<%= juggernaut(:channels => ['one', 'two', 'three']) %>
Broadcast to channels
render :juggernaut => {
:type => :send_to_channels,
:channels => ['one']
} do |page|
page.alert('Hello World')
end
Subscribe as a particular client
<%= juggernaut(:client_id => current_user.id) %>
Broadcast to a particular client
render :juggernaut => {
:type => :send_to_client,
:client_id => @user.id
} do |page|
page.alert('Hello World')
end
Find connected clients
Juggernaut.show_clients
Don’t want inline RJS?
render_juggernaut('person_update.rjs')
Don’t Want RJS?
Juggernaut.send_to_all(“alert(‘foo’);”)
Juggernaut.send_to_client(“alert(‘foo’);”, @user.id)
Juggernaut.send_to_channel(“alert(‘foo’);”, @channel)
Demo 2: Google Maps
http://railsconf.madebymany.co.uk
tips
Don’t push huge amounts of HTML to the browser. Trigger an AJAX request instead
Don’t push huge amounts of Javascript to the browser. Trigger a function call already loaded by the browser.
In callbacks Juggernaut will pass the session id so you can use existing session information.
Escape your user inputs!! XSS is very dangerous in a Push JavaScript world.
Thank You! http://juggernaut.rubyforge.org/
Q & A