Real Time Web sans Node

Real Time Web sans Node

High traffic websites — Gmail, Facebook, Twitter — send live updates to their users all day long (think: collaborative editing in Google docs). Unfortunately, most of the sites we write wait for users to request data. Let’s look at what technologies exist in the Python world that can help us send data to our users.

Example code here:
https://github.com/wowzer/rtw

1dc517e607a0a4fe2592bb743670b243?s=128

Michael Irani

March 18, 2014
Tweet

Transcript

  1. Michael Irani REAL TIME WEB SANS NODE 3.18.2014

  2. •  Blogs •  Hacker News •  News sites •  Flickr

    •  Craigslist •  Wikipedia •  Pandora •  Ebay HTTP – BUILT FOR REQUESTS
  3. ¡ Social feeds ¡ Site usage ¡ Sports scores ¡ Stock ticker ¡ Collaborative editing

    ¡ Chat ¡ Multiplayer games ¡ Server/process data BIDERECTIONAL COMMUNICATION
  4. ¡ Long polling ¡ TCP, keep-alive header ¡ Chunked transfer encoding ¡ Forever iframe

    ¡ XMLHttpRequest (XHR) Ajax Push COMET
  5. Bidirectional Server-client TCP connection WEBSOCKETS

  6. Python @app.route('/websocket') def handle_websocket(): ws = request.environ.get('wsgi.websocket') if not ws:

    abort(400) while True: message = ws.receive() ws.send(“send message to client”) @app.route('/') def main(): root = 'templates', mimetype="text/html" return static_file('index.html', root=root) wsgi_server = WSGIServer(app, handler_class=WebSocketHandler) wsgi_server.serve_forever() Javascript var ws = new WebSocket("ws:// localhost:8080/websocket"); ws.onopen = function() { ws.send("Hello, world"); }; ws.onmessage = function (evt) { console.log(evt.data); }; BOTTLE – GEVENT - STRAIGHT WEBSOCKET
  7. ¡ SockJS ¡ Socket.IO ¡ Faye ¡ Engine.IO ¡ Autobahn Code that provides technology you’d

    expect a browser to have natively POLYFILL LIBRARIES
  8. Python class HWNamespace(BaseNamespace): def on_from_client(self, message): return ”Message from server”

    @app.route('/socket.io/<path:remaining>') def handle_websocket(remaining): socketio_manage(request.environ, {'/ hello': HWNamespace}, request) return Response() @app.route('/') def main(): return render_template('index.html') SocketIOServer(app, resource="socket.io").serve_forever() Javascript var socket = io.connect("/hello"); socket.on('connect', function () { console.log('connected'); socket.emit(’from_client', 'Hello, socket.io!', function(response) { console.log(response); }); }); FLASK – GEVENT – SOCKET.IO
  9. EXAMPLE – TORNADO W/ SOCKJS

  10. WSGI issues PYTHON

  11. ¡ Synchronous ¡ Only one request at a time WSGI – WEB

    SERVER GATEWAY INTERFACE
  12. Coroutines (greenlets) ¡ Asynchronous functions ¡ Pause a function ¡ Comes from Stackless

    Python Callbacks ¡ Initial request tells Python to call a certain function when condition met ¡ Futures ¡ Generators ASYNCHRONOUS
  13. ¡ GEvent ¡ Tornado ¡ Twisted ¡ Cyclone ¡ Eventlet ¡ geventwebsocket ¡ gevent-socketio ¡ tornadio ¡ Tornadio2 ¡ sockjs-tornado

    ¡ SockJS-Twisted ¡ SockJS-cyclone PYTHON OPTIONS
  14. GEvent ¡ gevent-socketio ¡ gevent-websocket Tornado ¡ sockjs-tornado ACTUAL PYTHON OPTIONS

  15. ¡ RabbitMQ ¡ ActiveMQ ¡ Redis ¡ ZeroMQ MESSAGING

  16. Client ¡ SockJS ¡ Backbone Async application ¡ Redis (Pub/Sub) ¡ Tornado SAMPLE COMPLETE

    STACK WSGI application ¡ Django ¡ PostgreSQL ¡ Redis (caching) Server ¡ ZeroMQ: messaging ¡ CloudFlare: CDN ¡ Nginx § Load balancer § Server) ¡ Ubuntu
  17. ¡ Autobahn: Twisted, asyncio, WAMP ¡ WAMP: Web Application Messaging Protocol ¡ Brubeck:

    Mongrel2, 0MQ, Redis, GEvent THINGS TO LOOK INTO
  18. ¡ NYTimes ¡ StackOverflow ¡ http://kaazing.com ¡ http://playbuildy.com ¡ http://pythonanywhere.com ¡ http://hubdoc.com SITES USING WEBSOCKETS

  19. ¡ Wireshark: “websocket” filter ¡ Chrome: developer tools, Network, 101 response codes

    TOOLS
  20. ¡  http://blog.pythonisito.com/2013/04/mongodb-pubsub-with-capped- collections.html ¡  http://mrjoes.github.io/2013/06/21/python-realtime.html ¡  http://blog.kgriffs.com/2012/12/18/uwsgi-vs-gunicorn-vs-node- benchmarks.html ¡  http://www.javaworld.com/article/2071232/java-app-dev/9-killer-uses-for-

    websockets.html ¡  https://groups.google.com/forum/#!topic/sockjs/lgzxVnlth54 ¡  https://github.com/LearnBoost/socket.io/issues/ 193#issuecomment-7308865 ¡  http://mrjoes.github.io/2011/12/15/sockjs-bench.html ¡  http://blog.pythonanywhere.com/27 RESOURCES
  21. @wowzer GITHUB.COM/WOWZER/RTW SPEAKERDECK.COM/WOWZER/ REAL-TIME-WEB-SANS-NODE