0% found this document useful (0 votes)
514 views63 pages

Sockjs: Websocket Emulation Kept Simple, Stupid

The document discusses SockJS, a JavaScript library that provides a WebSocket-like object for browsers that don't support WebSocket. It allows real-time messaging between the browser and the server. SockJS provides fallback options, supports cross-domain communication, and explains how to scale deployments. The library aims to abstract real-time messaging while not prescribing a specific messaging model.

Uploaded by

Robert Poulson
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
514 views63 pages

Sockjs: Websocket Emulation Kept Simple, Stupid

The document discusses SockJS, a JavaScript library that provides a WebSocket-like object for browsers that don't support WebSocket. It allows real-time messaging between the browser and the server. SockJS provides fallback options, supports cross-domain communication, and explains how to scale deployments. The library aims to abstract real-time messaging while not prescribing a specific messaging model.

Uploaded by

Robert Poulson
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 63

WebSocket emulation kept simple, stupid

SockJS

Marek Majkowski
[email protected]

Tuesday, 8 November 11

The plan
WebSockets SockJS Messaging models

Tuesday, 8 November 11

Load Balancer

@sockjs http://sockjs.org github.com/sockjs


Tuesday, 8 November 11

Web server

Web server

Web server

Message bus

#sockjs
Tuesday, 8 November 11

#sockjs
Tuesday, 8 November 11

WebSockets
hixie-75 4 hixie-76 (disabled) hybi-07 hybi-10 hybi-17
Tuesday, 8 November 11

4 6

5.0.0 5.0.1 11 (disabled)

6 7 14 16-dev
#sockjs

10-dev

WebSockets

{ {

hixie-75 4 hixie-76 (disabled) hybi-07 hybi-10 hybi-17 6 7

4 6

5.0.0 5.0.1 11 (disabled)

14 16-dev

10-dev

#sockjs
Tuesday, 8 November 11

FF and Proxies
GET /echo/070/lm6wwjpr/websocket HTTP/1.1 Host: sockjs1.popcnt.org User-Agent: [...] Gecko/20100101 Firefox/6.0.2 Accept: text/html,application/xhtml [...] Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Sec-WebSocket-Version: 7 Sec-WebSocket-Origin: http://sockjs.popcnt.org Sec-WebSocket-Key: bzG4fOYXabSiy42uFj6vjA== Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Connection: Upgrade HTTP/1.0 400 Bad Request Server: squid/2.7.STABLE9 Date: Wed, 21 Sep 2011 06:16:10 GMT Content-Type: text/html Content-Length: 1943 X-Squid-Error: ERR_INVALID_REQ 0 X-Cache: MISS from mrstu Connection: close
Tuesday, 8 November 11

CONNECT sockjs1.popcnt.org:80 HTTP/1.1 Host: sockjs1.popcnt.org Proxy-Connection: keep-alive GET /echo/855/duzzy2p1/websocket HTTP/1.1 Upgrade: WebSocket Connection: Upgrade Host: sockjs1.popcnt.org Origin: http://sockjs.popcnt.org Sec-WebSocket-Key1: 22p/ D"47900%n7 r90. Sec-WebSocket-Key2: m49" 5 f 24772 Ra

#sockjs

#1 Realtime web: Not there yet!

#sockjs
Tuesday, 8 November 11

SockJS
Load Balancer

Web server

Web server

Web server

Message bus

#sockjs
Tuesday, 8 November 11

SockJS
1. WebSocket like API 2. Fallbacks 3. Cross domain support 4. Scalability explained 5. Specied protocol, polyglot 6. No messaging model
#sockjs
Tuesday, 8 November 11

SockJS
1. WebSocket like API 2. Fallbacks 3. Cross domain support 4. Scalability explained 5. Specied protocol, polyglot 6. No messaging model
#sockjs
Tuesday, 8 November 11

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>

#sockjs
Tuesday, 8 November 11

WebSocket like API


var 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');

#sockjs
Tuesday, 8 November 11

SockJS
1. WebSocket like API 2. Fallbacks 3. Cross domain support 4. Scalability explained 5. Specied protocol, polyglot 6. No messaging model
#sockjs
Tuesday, 8 November 11

Fallbacks

#sockjs
Tuesday, 8 November 11

SockJS
1. WebSocket like API 2. Fallbacks 3. Cross domain support 4. Scalability explained 5. Specied protocol, polyglot 6. No messaging model
#sockjs
Tuesday, 8 November 11

Cross domain
Load Balancer

Web server

Web server

Web server

Message bus

#sockjs
Tuesday, 8 November 11

Cross domain
Load Balancer Load Balancer

Web server

Web server

Web server

Async server

Database

Message bus

#sockjs
Tuesday, 8 November 11

SockJS
1. WebSocket like API 2. Fallbacks 3. Cross domain support 4. Scalability explained 5. Specied protocol, polyglot 6. No messaging model
#sockjs
Tuesday, 8 November 11

Load blancer
Load Balancer

Web server

Web server

Web server

Message bus

#sockjs
Tuesday, 8 November 11

Load blancer

?
Web server
Tuesday, 8 November 11

Load Balancer

Web server

Web server

Message bus

#sockjs

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

#sockjs
Tuesday, 8 November 11

Sticky sessions
Load Balancer

prex based JSESSIONID cookie

Web server

Web server

Web server

Message bus

#sockjs
Tuesday, 8 November 11

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

#sockjs
Tuesday, 8 November 11

Deployment
Load Balancer

Web server

Web server

Web server

Message bus

#sockjs
Tuesday, 8 November 11

Deployment
Load Balancer Load Balancer

Web server

Web server

Web server

Async server

Database

Message bus

#sockjs
Tuesday, 8 November 11

Deployment
Load Balancer Load Balancer

SockJS proxy

ws:// Web server

ws:// Web server

ws:// Web server

Message bus

#sockjs
Tuesday, 8 November 11

SockJS
1. WebSocket like API 2. Fallbacks 3. Cross domain support 4. Scalability explained 5. Specied protocol, polyglot 6. No messaging model
#sockjs
Tuesday, 8 November 11

SockJS protocol

XXX screenshot

#sockjs
Tuesday, 8 November 11

QUnit tests

#sockjs
Tuesday, 8 November 11

Polyglot

Server side:

simple, testable

Supported: Node.js, Erlang, LUA, Ruby*


#sockjs

Tuesday, 8 November 11

SockJS
1. WebSocket like API 2. Fallbacks 3. Cross domain support 4. Scalability explained 5. Specied protocol, polyglot 6. No messaging model
#sockjs
Tuesday, 8 November 11

No messaging model
Transport

Pub/Sub

Value + Presence Updates

Work Queues

#sockjs
Tuesday, 8 November 11

No messaging model
Transport

Pub/Sub

Value + Presence Updates

Work Queues

#sockjs
Tuesday, 8 November 11

Web Messaging Service

Load Balancer
Service

Web server

Web server

Web server

Database

#sockjs
Tuesday, 8 November 11

Web Messaging Service

Load Balancer
Service

Web server

Web server

Web server

Database

#sockjs
Tuesday, 8 November 11

#sockjs
Tuesday, 8 November 11

Google App Engine



Simplex No broadcast No presence
App

user

#sockjs
Tuesday, 8 November 11

PubNub

Duplex Broadcast No permissions No identity
App
subscribe("/topic") publish("/topic")

#sockjs
Tuesday, 8 November 11

Pusher

Simplex Broadcast Permissions * Identity * Presence *
App
publish("/topic") subscribe("/topic")

#sockjs
Tuesday, 8 November 11

#sockjs
Tuesday, 8 November 11

Chat app
/chat /roster

#sockjs
Tuesday, 8 November 11

Chat app
/chat /roster

#sockjs
Tuesday, 8 November 11

Chat app
/chat /roster

#sockjs
Tuesday, 8 November 11

1. Authorisation 2. Value + updates 3. Presence


index.html

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

App

#sockjs
Tuesday, 8 November 11

1. Authorisation 2. Value + updates 3. Presence

#sockjs
Tuesday, 8 November 11

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

App

GET index.html

#sockjs
Tuesday, 8 November 11

Authorization
2. identity and permissions token 4.

App

1. GET 3. token

#sockjs
Tuesday, 8 November 11

1. Authorisation 2. Value + updates 3. Presence

#sockjs
Tuesday, 8 November 11

V+U: Application
App
get historical data for "/chat" [...] <dwww> Version/11.51 <majek> ah, boring then. <dwww> i copypasted what qunit page reports <dwww> ;) <majek> No browser works on your computer :)

subscribe("/chat") updates from "chat"

#sockjs
Tuesday, 8 November 11

V+U: Application
App
get historical data for "/chat" [...] <dwww> Version/11.51 <majek> ah, boring then. <dwww> i copypasted what qunit page reports <dwww> ;) <majek> No browser works on your computer :)

subscribe("/chat") updates from "chat"

}
#sockjs

Tuesday, 8 November 11

1. Authorisation 2. Value + updates 3. Presence

#sockjs
Tuesday, 8 November 11

Presence naively
subscribe("/chat") subscribe("/roster")

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

updates from "chat"

updates from "roster"

#sockjs
Tuesday, 8 November 11

Presence naively
subscribe("/chat") subscribe("/roster")

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

updates from "chat"

updates from "roster"

#sockjs
Tuesday, 8 November 11

Presence naively
subscribe("/chat") subscribe("/roster")

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

}
#sockjs

updates from "chat"

updates from "roster"

Tuesday, 8 November 11

Service?

Load Balancer
Service

Web server

Web server

Web server

Database

#sockjs
Tuesday, 8 November 11

SockJS

Web server

Web server

Application

Application

Messaging

Messaging

Message bus

#sockjs
Tuesday, 8 November 11

#3 Realtime web: Not there yet!

#sockjs
Tuesday, 8 November 11

#sockjs
Tuesday, 8 November 11

#sockjs
Tuesday, 8 November 11

@sockjs http://sockjs.org github.com/sockjs/sockjs-client


#sockjs
Tuesday, 8 November 11

#sockjs
Tuesday, 8 November 11

You might also like