Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SockJS - WebSocket Emulation simple, stupid; krtconf Nov-2011

majek04
November 14, 2011

SockJS - WebSocket Emulation simple, stupid; krtconf Nov-2011

majek04

November 14, 2011
Tweet

More Decks by majek04

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. #sockjs
    Tuesday, 8 November 11

    View Slide

  5. #sockjs
    Tuesday, 8 November 11

    View Slide

  6. #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

    View Slide

  7. #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

    View Slide

  8. #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

    View Slide

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

    View Slide

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

    View Slide

  11. #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

    View Slide

  12. #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

    View Slide

  13. #sockjs
    WebSocket like API
    <br/>var sock = new SockJS('http://mydomain.com/my_prefix');<br/>sock.onopen = function() {<br/>console.log('open');<br/>};<br/>sock.onmessage = function(e) {<br/>console.log('message', e.data);<br/>};<br/>sock.onclose = function() {<br/>console.log('close');<br/>};<br/>
    Tuesday, 8 November 11

    View Slide

  14. #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

    View Slide

  15. #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

    View Slide

  16. #sockjs
    Fallbacks
    Tuesday, 8 November 11

    View Slide

  17. #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

    View Slide

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

    View Slide

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

    View Slide

  20. #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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. #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

    View Slide

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

    View Slide

  31. #sockjs
    QUnit tests
    Tuesday, 8 November 11

    View Slide

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

    View Slide

  33. #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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  38. #sockjs
    Tuesday, 8 November 11

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  42. #sockjs
    Tuesday, 8 November 11

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  51. #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

    View Slide

  52. #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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  60. #sockjs
    Tuesday, 8 November 11

    View Slide

  61. #sockjs
    Tuesday, 8 November 11

    View Slide

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

    View Slide

  63. #sockjs
    Tuesday, 8 November 11

    View Slide