RailsConf Europe 2008 Juggernaut Realtime Rails

100
RailsConf Europe 2008 Juggernaut Realtime Rails Alex MacCaw and Stuart Eccles

Transcript of RailsConf Europe 2008 Juggernaut Realtime Rails

Page 1: RailsConf Europe 2008 Juggernaut Realtime Rails

RailsConf Europe 2008

Juggernaut Realtime Rails

Alex MacCaw and Stuart Eccles

Page 2: RailsConf Europe 2008 Juggernaut Realtime Rails

RailsConf Europe 2008

Juggernaut Realtime Rails

Alex MacCaw and Stuart Eccles

Page 3: RailsConf Europe 2008 Juggernaut Realtime Rails

http://www.madebymany.co.uk/

Page 4: RailsConf Europe 2008 Juggernaut Realtime Rails

server push

Page 5: RailsConf Europe 2008 Juggernaut Realtime Rails

HTTP

Client Server

HTTP GET/POST

<html/> <script/>

Page 6: RailsConf Europe 2008 Juggernaut Realtime Rails

Server Push

Client Server

Page 7: RailsConf Europe 2008 Juggernaut Realtime Rails

what is Juggernaut?

Page 8: RailsConf Europe 2008 Juggernaut Realtime Rails

HistoryWritten by Alex MacCaw in 2006

Published at http://juggernaut.rubyforge.org/

Latest versions at GitHub just for Edge Rails

MIT License

Page 9: RailsConf Europe 2008 Juggernaut Realtime Rails

3 Components

Invisible Flash SWF

Rails PluginJuggernaut

Server

Client Messenger Broadcaster

Page 10: RailsConf Europe 2008 Juggernaut Realtime Rails

Juggernaut is also

Page 11: RailsConf Europe 2008 Juggernaut Realtime Rails

what do we want?

This guy....

Page 12: RailsConf Europe 2008 Juggernaut Realtime Rails

what do we want?

This guy....

Page 13: RailsConf Europe 2008 Juggernaut Realtime Rails

X-Men Character

Page 14: RailsConf Europe 2008 Juggernaut Realtime Rails

X-Men Character

Page 15: RailsConf Europe 2008 Juggernaut Realtime Rails

the other Juggernaut?

Page 16: RailsConf Europe 2008 Juggernaut Realtime Rails

real world users

Page 17: RailsConf Europe 2008 Juggernaut Realtime Rails

Collaboration

Page 18: RailsConf Europe 2008 Juggernaut Realtime Rails

Real Time Interaction

Page 19: RailsConf Europe 2008 Juggernaut Realtime Rails

Multiplayer Games

Page 20: RailsConf Europe 2008 Juggernaut Realtime Rails

Multiplayer Games

Page 21: RailsConf Europe 2008 Juggernaut Realtime Rails

Chat

Page 22: RailsConf Europe 2008 Juggernaut Realtime Rails

Real Time Activity Feeds

Page 23: RailsConf Europe 2008 Juggernaut Realtime Rails

Enhancing Traditional Media

Page 24: RailsConf Europe 2008 Juggernaut Realtime Rails

juggernautcompetition

Page 25: RailsConf Europe 2008 Juggernaut Realtime Rails
Page 26: RailsConf Europe 2008 Juggernaut Realtime Rails

resource intensive

Page 27: RailsConf Europe 2008 Juggernaut Realtime Rails

resource intensive

not

realtime

Page 28: RailsConf Europe 2008 Juggernaut Realtime Rails
Page 29: RailsConf Europe 2008 Juggernaut Realtime Rails

Firefox memory issues

Page 30: RailsConf Europe 2008 Juggernaut Realtime Rails

Firefox memory issues

not

cross-

domain

Page 31: RailsConf Europe 2008 Juggernaut Realtime Rails

Firefox memory issues

not

cross-

domain

IE

clicking

Page 32: RailsConf Europe 2008 Juggernaut Realtime Rails

Firefox memory issues

not

cross-

domain

IE

clicking

max 2

streams in IE

Page 33: RailsConf Europe 2008 Juggernaut Realtime Rails

features browser

compatibilityFlash 8> 95% of all browserscross-OSPrototype and JQuery versions

Page 34: RailsConf Europe 2008 Juggernaut Realtime Rails

features scale with

eventmachine30k concurrent usersand clustering support

Page 35: RailsConf Europe 2008 Juggernaut Realtime Rails

features channelsclient can subscribe to one or more channelsBroadcast can be channel selectedBroadcast can even be client selected

Page 36: RailsConf Europe 2008 Juggernaut Realtime Rails

features authentication

IP whitelistshared secretsauthentication callbacks

Page 37: RailsConf Europe 2008 Juggernaut Realtime Rails

features callbacksclient connect callbackclient disconnect callback

Page 38: RailsConf Europe 2008 Juggernaut Realtime Rails

features queries

query server for list of clients

Page 39: RailsConf Europe 2008 Juggernaut Realtime Rails

in pictures

Page 40: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

Page 41: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

Page 42: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

GET

Page 43: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

OK

Page 44: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

SUBSCRIBE

Page 45: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

Page 46: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

callback

Page 47: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

SUBSCRIBE

Page 48: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEXcallback

Page 49: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

JSON MESSAGE

RJS

Page 50: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

JS

Page 51: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

JS

Page 52: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

JS

Wonder-women has entered chat

Page 53: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

JS

Wonder-women has entered chat

Page 54: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

Page 55: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

Page 56: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

AJAX

Page 57: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

JSON MESSAGE

RJS

Page 58: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

JS

JS

JS

Page 59: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

JS

JS

JS

Page 60: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

JS

JS

JS

Page 61: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

JS

JS

JS

Page 62: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

SuperMan says ‘Hi!’

SuperMan says ‘Hi!’

SuperMan says ‘Hi!’

Page 63: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

Page 64: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

Page 65: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

RAKE

Page 66: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

RJS

JSON MESSAGE

Page 67: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

JS

JS

JS

Page 68: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

JS

JS

JS

Page 69: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

JS

JS

JS

Page 70: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

JS

JS

JS

Page 71: RailsConf Europe 2008 Juggernaut Realtime Rails

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!

Page 72: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

Page 73: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

Page 74: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

DUPLEX

notification

Page 75: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

callback

Page 76: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

RJS

JSON MESSAGE

Page 77: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

JS

JS

Page 78: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

JS

JS

Page 79: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

JS

JS

Page 80: RailsConf Europe 2008 Juggernaut Realtime Rails

Rails Application

Juggernaut Rails Plugin

Juggernaut Push Server

DUPLEX

DUPLEX

SuperMan has left the building!

SuperMan has left the building!

Page 81: RailsConf Europe 2008 Juggernaut Realtime Rails

Audience Participation

http://railsconf.madebymany.co.uk

Page 82: RailsConf Europe 2008 Juggernaut Realtime Rails

def code

Page 83: RailsConf Europe 2008 Juggernaut Realtime Rails

Partial Update Example

Page 84: RailsConf Europe 2008 Juggernaut Realtime Rails

Install Juggernaut

script/plugin install \

http://juggernaut.rubyforge.org/svn/trunk/juggernaut

sudo gem install juggernaut

(includes json and eventmachine dependencies)

Page 85: RailsConf Europe 2008 Juggernaut Realtime Rails

Start the Push Server

juggernaut -g juggernaut.yml

juggernaut -c juggernaut.yml

Page 86: RailsConf Europe 2008 Juggernaut Realtime Rails

<%= juggernaut %>

View

<%= javascript_include_tag :defaults,

:juggernaut %>

<html>

<head>

</head>

Page 87: RailsConf Europe 2008 Juggernaut Realtime Rails

Controller

render :juggernaut do |page|

page.replace 'person-45',

:partial => 'person'

end

Page 88: RailsConf Europe 2008 Juggernaut Realtime Rails

That’s it!

Page 89: RailsConf Europe 2008 Juggernaut Realtime Rails

Demo 1: Chat

Page 90: RailsConf Europe 2008 Juggernaut Realtime Rails

Subscribe to channels

<%= juggernaut(:channels => ['one', 'two', 'three']) %>

Page 91: RailsConf Europe 2008 Juggernaut Realtime Rails

Broadcast to channels

render :juggernaut => {

:type => :send_to_channels,

:channels => ['one']

} do |page|

page.alert('Hello World')

end

Page 92: RailsConf Europe 2008 Juggernaut Realtime Rails

Subscribe as a particular client

<%= juggernaut(:client_id => current_user.id) %>

Page 93: RailsConf Europe 2008 Juggernaut Realtime Rails

Broadcast to a particular client

render :juggernaut => {

:type => :send_to_client,

:client_id => @user.id

} do |page|

page.alert('Hello World')

end

Page 94: RailsConf Europe 2008 Juggernaut Realtime Rails

Find connected clients

Juggernaut.show_clients

Page 95: RailsConf Europe 2008 Juggernaut Realtime Rails

Don’t want inline RJS?

render_juggernaut('person_update.rjs')

Page 96: RailsConf Europe 2008 Juggernaut Realtime Rails

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)

Page 97: RailsConf Europe 2008 Juggernaut Realtime Rails

Demo 2: Google Maps

http://railsconf.madebymany.co.uk

Page 98: RailsConf Europe 2008 Juggernaut Realtime Rails

tips

Page 99: RailsConf Europe 2008 Juggernaut Realtime Rails

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.

Page 100: RailsConf Europe 2008 Juggernaut Realtime Rails

Thank You! http://juggernaut.rubyforge.org/

Q & A