RailsConf Europe 2008 Juggernaut Realtime Rails

Preview:

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