Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

The plan • WebSockets • SockJS • Messaging models Tuesday, 8 November 11

Slide 3

Slide 3 text

Load Balancer Web server Web server Web server Message bus @sockjs http://sockjs.org github.com/sockjs Tuesday, 8 November 11

Slide 4

Slide 4 text

#sockjs Tuesday, 8 November 11

Slide 5

Slide 5 text

#sockjs Tuesday, 8 November 11

Slide 6

Slide 6 text

#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

Slide 7

Slide 7 text

#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

Slide 8

Slide 8 text

#sockjs FF and Proxies 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 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

Slide 9

Slide 9 text

#sockjs • #1 Realtime web: Not there yet! Tuesday, 8 November 11

Slide 10

Slide 10 text

#sockjs SockJS Load Balancer Web server Web server Web server Message bus Tuesday, 8 November 11

Slide 11

Slide 11 text

#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

Slide 12

Slide 12 text

#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

Slide 13

Slide 13 text

#sockjs WebSocket like API 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'); }; Tuesday, 8 November 11

Slide 14

Slide 14 text

#sockjs 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'); Tuesday, 8 November 11

Slide 15

Slide 15 text

#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

Slide 16

Slide 16 text

#sockjs Fallbacks Tuesday, 8 November 11

Slide 17

Slide 17 text

#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

Slide 18

Slide 18 text

#sockjs Cross domain Load Balancer Web server Web server Web server Message bus Tuesday, 8 November 11

Slide 19

Slide 19 text

#sockjs Cross domain Load Balancer Web server Web server Web server Database Load Balancer Async server Message bus Tuesday, 8 November 11

Slide 20

Slide 20 text

#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

Slide 21

Slide 21 text

#sockjs Load blancer Load Balancer Web server Web server Web server Message bus Tuesday, 8 November 11

Slide 22

Slide 22 text

#sockjs ? Load blancer Load Balancer Web server Web server Web server Message bus Tuesday, 8 November 11

Slide 23

Slide 23 text

#sockjs Load balancer var sockjs_opts = { [...] disabled_transports: ['websocket'] }; Tuesday, 8 November 11

Slide 24

Slide 24 text

#sockjs Sticky sessions Load Balancer Web server Web server Web server Message bus • prefix based • JSESSIONID cookie Tuesday, 8 November 11

Slide 25

Slide 25 text

#sockjs Sticky sessions var sockjs_opts = { [...] cookies: true }; Tuesday, 8 November 11

Slide 26

Slide 26 text

#sockjs Deployment Load Balancer Web server Web server Web server Message bus Tuesday, 8 November 11

Slide 27

Slide 27 text

#sockjs Load Balancer Web server Web server Web server Database Load Balancer Async server Message bus Deployment Tuesday, 8 November 11

Slide 28

Slide 28 text

#sockjs ws:// Load Balancer Web server Web server Web server Message bus ws:// ws:// Load Balancer SockJS proxy Deployment Tuesday, 8 November 11

Slide 29

Slide 29 text

#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

Slide 30

Slide 30 text

#sockjs SockJS protocol • XXX screenshot Tuesday, 8 November 11

Slide 31

Slide 31 text

#sockjs QUnit tests Tuesday, 8 November 11

Slide 32

Slide 32 text

#sockjs Polyglot • Server side: • simple, testable • Supported: • Node.js, Erlang, LUA, Ruby* Tuesday, 8 November 11

Slide 33

Slide 33 text

#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

Slide 34

Slide 34 text

#sockjs Transport Pub/Sub Work Queues Presence Value + Updates No messaging model Tuesday, 8 November 11

Slide 35

Slide 35 text

#sockjs Transport Pub/Sub Work Queues Presence Value + Updates No messaging model Tuesday, 8 November 11

Slide 36

Slide 36 text

#sockjs Load Balancer Web server Web server Web server Database Service Web Messaging Service Tuesday, 8 November 11

Slide 37

Slide 37 text

#sockjs Load Balancer Web server Web server Web server Database Service Web Messaging Service Tuesday, 8 November 11

Slide 38

Slide 38 text

#sockjs Tuesday, 8 November 11

Slide 39

Slide 39 text

#sockjs Google App Engine • Simplex • No broadcast • No presence user App Tuesday, 8 November 11

Slide 40

Slide 40 text

#sockjs PubNub • Duplex • Broadcast • No permissions • No identity subscribe("/topic") publish("/topic") App Tuesday, 8 November 11

Slide 41

Slide 41 text

#sockjs Pusher • Simplex • Broadcast • Permissions * • Identity * • Presence * App publish("/topic") subscribe("/topic") Tuesday, 8 November 11

Slide 42

Slide 42 text

#sockjs Tuesday, 8 November 11

Slide 43

Slide 43 text

#sockjs Chat app • /chat • /roster Tuesday, 8 November 11

Slide 44

Slide 44 text

#sockjs Chat app • /chat • /roster Tuesday, 8 November 11

Slide 45

Slide 45 text

#sockjs Chat app • /chat • /roster Tuesday, 8 November 11

Slide 46

Slide 46 text

#sockjs 1. Authorisation 2. Value + updates 3. Presence App subscribe("/chat") subscribe("/roster") index.html Tuesday, 8 November 11

Slide 47

Slide 47 text

#sockjs 1. Authorisation 2. Value + updates 3. Presence Tuesday, 8 November 11

Slide 48

Slide 48 text

#sockjs Authorization App subscribe("/chat") subscribe("/roster") index.html GET Tuesday, 8 November 11

Slide 49

Slide 49 text

#sockjs App 2. identity and permissions 4. 3. token token 1. GET Authorization Tuesday, 8 November 11

Slide 50

Slide 50 text

#sockjs 1. Authorisation 2. Value + updates 3. Presence Tuesday, 8 November 11

Slide 51

Slide 51 text

#sockjs V+U: Application subscribe("/chat") …updates from "chat"… get historical data for "/chat" App [...] Version/11.51 ah, boring then. i copypasted what qunit page reports ;) No browser works on your computer :) Tuesday, 8 November 11

Slide 52

Slide 52 text

#sockjs V+U: Application } subscribe("/chat") …updates from "chat"… get historical data for "/chat" App [...] Version/11.51 ah, boring then. i copypasted what qunit page reports ;) No browser works on your computer :) Tuesday, 8 November 11

Slide 53

Slide 53 text

#sockjs 1. Authorisation 2. Value + updates 3. Presence Tuesday, 8 November 11

Slide 54

Slide 54 text

#sockjs Presence naively subscribe("/chat") subscribe("/roster") send("/roster","Marek entered") …updates from "chat"… …updates from "roster"… Tuesday, 8 November 11

Slide 55

Slide 55 text

#sockjs Presence naively subscribe("/chat") subscribe("/roster") send("/roster","Marek entered") …updates from "chat"… …updates from "roster"… Tuesday, 8 November 11

Slide 56

Slide 56 text

#sockjs Presence naively subscribe("/chat") subscribe("/roster") send("/roster","Marek entered") …updates from "chat"… …updates from "roster"… } Tuesday, 8 November 11

Slide 57

Slide 57 text

#sockjs Service? Load Balancer Web server Web server Web server Database Service Tuesday, 8 November 11

Slide 58

Slide 58 text

#sockjs SockJS Message bus Application Messaging Web server Application Messaging Web server Tuesday, 8 November 11

Slide 59

Slide 59 text

#sockjs • #3 Realtime web: Not there yet! Tuesday, 8 November 11

Slide 60

Slide 60 text

#sockjs Tuesday, 8 November 11

Slide 61

Slide 61 text

#sockjs Tuesday, 8 November 11

Slide 62

Slide 62 text

#sockjs @sockjs http://sockjs.org github.com/sockjs/sockjs-client Tuesday, 8 November 11

Slide 63

Slide 63 text

#sockjs Tuesday, 8 November 11