Sockjs: Websocket Emulation Kept Simple, Stupid
Sockjs: 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
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
6 7 14 16-dev
#sockjs
10-dev
WebSockets
{ {
4 6
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
#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
#sockjs
Tuesday, 8 November 11
#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
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
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
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
Work Queues
#sockjs
Tuesday, 8 November 11
No messaging model
Transport
Pub/Sub
Work Queues
#sockjs
Tuesday, 8 November 11
Load Balancer
Service
Web server
Web server
Web server
Database
#sockjs
Tuesday, 8 November 11
Load Balancer
Service
Web server
Web server
Web server
Database
#sockjs
Tuesday, 8 November 11
#sockjs
Tuesday, 8 November 11
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
subscribe("/chat") subscribe("/roster")
App
#sockjs
Tuesday, 8 November 11
#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
#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 :)
#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 :)
}
#sockjs
Tuesday, 8 November 11
#sockjs
Tuesday, 8 November 11
Presence naively
subscribe("/chat") subscribe("/roster")
send("/roster","Marek entered")
#sockjs
Tuesday, 8 November 11
Presence naively
subscribe("/chat") subscribe("/roster")
send("/roster","Marek entered")
#sockjs
Tuesday, 8 November 11
Presence naively
subscribe("/chat") subscribe("/roster")
send("/roster","Marek entered")
}
#sockjs
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
#sockjs
Tuesday, 8 November 11
#sockjs
Tuesday, 8 November 11
#sockjs
Tuesday, 8 November 11
#sockjs
Tuesday, 8 November 11