sockjs-krtconf

63
SockJS WebSocket emulation kept simple, stupid Marek Majkowski [email protected] Tuesday, 8 November 11

Transcript of sockjs-krtconf

Page 1: sockjs-krtconf

SockJSWebSocket emulation kept simple, stupid

Marek Majkowski

[email protected]

Tuesday, 8 November 11

Page 2: sockjs-krtconf

The plan

• WebSockets

• SockJS

• Messaging models

Tuesday, 8 November 11

Page 3: sockjs-krtconf

Load Balancer

Webserver

Webserver

Webserver

Message bus

@sockjshttp://sockjs.orggithub.com/sockjs

Tuesday, 8 November 11

Page 4: sockjs-krtconf

#sockjs

Tuesday, 8 November 11

Page 5: sockjs-krtconf

#sockjs

Tuesday, 8 November 11

Page 6: sockjs-krtconf

#sockjs

WebSockets

hixie-75 4 5.0.0

hixie-76 4 (disabled)

6 5.0.1 11 (disabled)

hybi-07 6

hybi-10 7 14 10-dev

hybi-17 16-dev

Tuesday, 8 November 11

Page 7: sockjs-krtconf

#sockjs

WebSockets

hixie-75 4 5.0.0

hixie-76 4 (disabled)

6 5.0.1 11 (disabled)

hybi-07 6

hybi-10 7 14 10-dev

hybi-17 16-dev

{{Tuesday, 8 November 11

Page 8: sockjs-krtconf

#sockjs

FF and Proxies

CONNECT sockjs1.popcnt.org:80 HTTP/1.1Host: sockjs1.popcnt.orgProxy-Connection: keep-alive

GET /echo/855/duzzy2p1/websocket HTTP/1.1Upgrade: WebSocketConnection: UpgradeHost: sockjs1.popcnt.orgOrigin: http://sockjs.popcnt.orgSec-WebSocket-Key1: 22p/ D"47900%n7 r90.Sec-WebSocket-Key2: m49" 5 f 24772 Ra 0

GET /echo/070/lm6wwjpr/websocket HTTP/1.1Host: sockjs1.popcnt.orgUser-Agent: [...] Gecko/20100101 Firefox/6.0.2Accept: text/html,application/xhtml [...]Accept-Language: en-us,en;q=0.5Accept-Encoding: gzip, deflateAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Sec-WebSocket-Version: 7Sec-WebSocket-Origin: http://sockjs.popcnt.orgSec-WebSocket-Key: bzG4fOYXabSiy42uFj6vjA==Pragma: no-cacheCache-Control: no-cacheUpgrade: websocketConnection: Upgrade

HTTP/1.0 400 Bad RequestServer: squid/2.7.STABLE9Date: Wed, 21 Sep 2011 06:16:10 GMTContent-Type: text/htmlContent-Length: 1943X-Squid-Error: ERR_INVALID_REQ 0X-Cache: MISS from mrstuConnection: close

Tuesday, 8 November 11

Page 9: sockjs-krtconf

#sockjs

• #1 Realtime web: Not there yet!

Tuesday, 8 November 11

Page 10: sockjs-krtconf

#sockjs

SockJS

Load Balancer

Webserver

Webserver

Webserver

Message bus

Tuesday, 8 November 11

Page 11: sockjs-krtconf

#sockjs

SockJS

1. WebSocket like API

2. Fallbacks

3. Cross domain support

4. Scalability explained

5. Specified protocol, polyglot

6. No messaging model

Tuesday, 8 November 11

Page 12: sockjs-krtconf

#sockjs

SockJS

1. WebSocket like API

2. Fallbacks

3. Cross domain support

4. Scalability explained

5. Specified protocol, polyglot

6. No messaging model

Tuesday, 8 November 11

Page 13: sockjs-krtconf

#sockjs

WebSocket like API

<script> var sock = new SockJS('http://mydomain.com/my_prefix'); sock.onopen = function() { console.log('open'); }; sock.onmessage = function(e) { console.log('message', e.data); }; sock.onclose = function() { console.log('close'); };</script>

Tuesday, 8 November 11

Page 14: sockjs-krtconf

#sockjs

WebSocket like APIvar http = require('http');var sockjs = require('sockjs');

var echo = sockjs.createServer(sockjs_opts);echo.on('connection', function(conn) { conn.on('data', function(message) { conn.write(message); }); conn.on('close', function() {});});

var server = http.createServer();echo.installHandlers(server, {prefix:'[/]echo'});server.listen(9999, '0.0.0.0');

Tuesday, 8 November 11

Page 15: sockjs-krtconf

#sockjs

SockJS

1. WebSocket like API

2. Fallbacks

3. Cross domain support

4. Scalability explained

5. Specified protocol, polyglot

6. No messaging model

Tuesday, 8 November 11

Page 16: sockjs-krtconf

#sockjs

Fallbacks

Tuesday, 8 November 11

Page 17: sockjs-krtconf

#sockjs

SockJS

1. WebSocket like API

2. Fallbacks

3. Cross domain support

4. Scalability explained

5. Specified protocol, polyglot

6. No messaging model

Tuesday, 8 November 11

Page 18: sockjs-krtconf

#sockjs

Cross domain

Load Balancer

Webserver

Webserver

Webserver

Message bus

Tuesday, 8 November 11

Page 19: sockjs-krtconf

#sockjs

Cross domain

Load Balancer

Webserver

Webserver

Webserver

Database

Load Balancer

Asyncserver

Messagebus

Tuesday, 8 November 11

Page 20: sockjs-krtconf

#sockjs

SockJS

1. WebSocket like API

2. Fallbacks

3. Cross domain support

4. Scalability explained

5. Specified protocol, polyglot

6. No messaging model

Tuesday, 8 November 11

Page 21: sockjs-krtconf

#sockjs

Load blancer

Load Balancer

Webserver

Webserver

Webserver

Message bus

Tuesday, 8 November 11

Page 22: sockjs-krtconf

#sockjs

?Load blancer

Load Balancer

Webserver

Webserver

Webserver

Message bus

Tuesday, 8 November 11

Page 23: sockjs-krtconf

#sockjs

Load balancer

var sockjs_opts = { [...]    disabled_transports: ['websocket']};

Tuesday, 8 November 11

Page 24: sockjs-krtconf

#sockjs

Sticky sessions

Load Balancer

Webserver

Webserver

Webserver

Message bus

• prefix based

• JSESSIONID cookie

Tuesday, 8 November 11

Page 25: sockjs-krtconf

#sockjs

Sticky sessions

var sockjs_opts = { [...]    cookies: true};

Tuesday, 8 November 11

Page 26: sockjs-krtconf

#sockjs

Deployment

Load Balancer

Webserver

Webserver

Webserver

Message bus

Tuesday, 8 November 11

Page 27: sockjs-krtconf

#sockjs

Load Balancer

Webserver

Webserver

Webserver

Database

Load Balancer

Asyncserver

Messagebus

Deployment

Tuesday, 8 November 11

Page 28: sockjs-krtconf

#sockjs

ws://

Load Balancer

Webserver

Webserver

Webserver

Message bus

ws:// ws://

Load Balancer

SockJSproxy

Deployment

Tuesday, 8 November 11

Page 29: sockjs-krtconf

#sockjs

SockJS

1. WebSocket like API

2. Fallbacks

3. Cross domain support

4. Scalability explained

5. Specified protocol, polyglot

6. No messaging model

Tuesday, 8 November 11

Page 30: sockjs-krtconf

#sockjs

SockJS protocol

• XXX screenshot

Tuesday, 8 November 11

Page 31: sockjs-krtconf

#sockjs

QUnit tests

Tuesday, 8 November 11

Page 32: sockjs-krtconf

#sockjs

Polyglot

• Server side:

• simple, testable

• Supported:

• Node.js, Erlang, LUA, Ruby*

Tuesday, 8 November 11

Page 33: sockjs-krtconf

#sockjs

SockJS

1. WebSocket like API

2. Fallbacks

3. Cross domain support

4. Scalability explained

5. Specified protocol, polyglot

6. No messaging model

Tuesday, 8 November 11

Page 34: sockjs-krtconf

#sockjs

Transport

Pub/Sub WorkQueuesPresenceValue +

Updates

No messaging model

Tuesday, 8 November 11

Page 35: sockjs-krtconf

#sockjs

Transport

Pub/Sub WorkQueuesPresenceValue +

Updates

No messaging model

Tuesday, 8 November 11

Page 36: sockjs-krtconf

#sockjs

Load Balancer

Webserver

Webserver

Webserver

Database

Service

Web Messaging Service

Tuesday, 8 November 11

Page 37: sockjs-krtconf

#sockjs

Load Balancer

Webserver

Webserver

Webserver

Database

Service

Web Messaging Service

Tuesday, 8 November 11

Page 38: sockjs-krtconf

#sockjs

Tuesday, 8 November 11

Page 39: sockjs-krtconf

#sockjs

Google App Engine

• Simplex

• No broadcast

• No presence

userApp

Tuesday, 8 November 11

Page 40: sockjs-krtconf

#sockjs

PubNub

• Duplex

• Broadcast

• No permissions

• No identity

subscribe("/topic")publish("/topic")

App

Tuesday, 8 November 11

Page 41: sockjs-krtconf

#sockjs

Pusher

• Simplex

• Broadcast

• Permissions *

• Identity *

• Presence *

App

publish("/topic") subscribe("/topic")

Tuesday, 8 November 11

Page 42: sockjs-krtconf

#sockjs

Tuesday, 8 November 11

Page 43: sockjs-krtconf

#sockjs

Chat app

• /chat

• /roster

Tuesday, 8 November 11

Page 44: sockjs-krtconf

#sockjs

Chat app

• /chat

• /roster

Tuesday, 8 November 11

Page 45: sockjs-krtconf

#sockjs

Chat app

• /chat

• /roster

Tuesday, 8 November 11

Page 46: sockjs-krtconf

#sockjs

1. Authorisation

2. Value + updates

3. Presence

App

subscribe("/chat")subscribe("/roster")

index.html

Tuesday, 8 November 11

Page 47: sockjs-krtconf

#sockjs

1. Authorisation

2. Value + updates

3. Presence

Tuesday, 8 November 11

Page 48: sockjs-krtconf

#sockjs

Authorization

App

subscribe("/chat")subscribe("/roster")

index.html

GET

Tuesday, 8 November 11

Page 49: sockjs-krtconf

#sockjs

App

2. identity and permissions

4.

3. token

token

1. GET

Authorization

Tuesday, 8 November 11

Page 50: sockjs-krtconf

#sockjs

1. Authorisation

2. Value + updates

3. Presence

Tuesday, 8 November 11

Page 51: sockjs-krtconf

#sockjs

V+U: Application

subscribe("/chat")

…updates from "chat"…

get historical data for "/chat"

App

[...]<dwww> Version/11.51<majek> ah, boring then.<dwww> i copypasted what qunit page reports<dwww> ;)<majek> No browser works on your computer :)

Tuesday, 8 November 11

Page 52: sockjs-krtconf

#sockjs

V+U: Application

}

subscribe("/chat")

…updates from "chat"…

get historical data for "/chat"

App

[...]<dwww> Version/11.51<majek> ah, boring then.<dwww> i copypasted what qunit page reports<dwww> ;)<majek> No browser works on your computer :)

Tuesday, 8 November 11

Page 53: sockjs-krtconf

#sockjs

1. Authorisation

2. Value + updates

3. Presence

Tuesday, 8 November 11

Page 54: sockjs-krtconf

#sockjs

Presence naively

subscribe("/chat")

subscribe("/roster")

send("/roster","Marek entered")

…updates from "chat"…

…updates from "roster"…

Tuesday, 8 November 11

Page 55: sockjs-krtconf

#sockjs

Presence naively

subscribe("/chat")

subscribe("/roster")

send("/roster","Marek entered")

…updates from "chat"…

…updates from "roster"…

Tuesday, 8 November 11

Page 56: sockjs-krtconf

#sockjs

Presence naively

subscribe("/chat")

subscribe("/roster")

send("/roster","Marek entered")

…updates from "chat"…

…updates from "roster"…

}

Tuesday, 8 November 11

Page 57: sockjs-krtconf

#sockjs

Service?

Load Balancer

Webserver

Webserver

Webserver

Database

Service

Tuesday, 8 November 11

Page 58: sockjs-krtconf

#sockjs

SockJS

Message bus

Application

Messaging

Web server

Application

Messaging

Web server

Tuesday, 8 November 11

Page 59: sockjs-krtconf

#sockjs

• #3 Realtime web: Not there yet!

Tuesday, 8 November 11

Page 60: sockjs-krtconf

#sockjs

Tuesday, 8 November 11

Page 61: sockjs-krtconf

#sockjs

Tuesday, 8 November 11

Page 62: sockjs-krtconf

#sockjs

@sockjs

http://sockjs.orggithub.com/sockjs/sockjs-client

Tuesday, 8 November 11

Page 63: sockjs-krtconf

#sockjs

Tuesday, 8 November 11