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

A Brief History of Channels

A Brief History of Channels

A talk I gave at DjangoCon Europe 2016

Andrew Godwin

March 31, 2016
Tweet

More Decks by Andrew Godwin

Other Decks in Programming

Transcript

  1. Andrew Godwin @andrewgodwin
    BRIEF HISTORY
    of
    CHANNELS
    A

    View Slide

  2. Andrew Godwin
    Hi, I'm
    Django core developer
    Senior Software Engineer at
    Likes networking a little bit too much

    View Slide

  3. Channels

    View Slide

  4. Channels?

    View Slide

  5. WebSocket

    View Slide

  6. HTTP 1
    request
    response
    Browser Server
    request
    response
    request
    response
    request
    response

    View Slide

  7. HTTP 2
    request
    response
    Browser Server
    request
    response
    request 1
    response 2
    request 2
    response 1

    View Slide

  8. WSGI
    request
    response
    Browser Server Django
    call app
    return val

    View Slide

  9. WebSockets
    receive
    send
    Browser Server
    send
    receive
    send
    send

    View Slide

  10. receive
    send
    Browser Server
    send
    receive
    send
    send
    Django
    ?

    View Slide

  11. Hard to deadlock
    Built-in authorisation
    Scales down
    Widely deployable
    Optional

    View Slide

  12. Django is not built for this.

    View Slide

  13. But what if it was?

    View Slide

  14. Instead of requests, we have events

    View Slide

  15. Events of the same type are grouped
    on a named channel

    View Slide

  16. HTTP requests
    HTTP responses
    WebSocket connecteds
    WebSocket frames received
    WebSocket frames sent
    WebSocket disconnections

    View Slide

  17. A channel is a:
    named,
    first-in-first-out,
    at-most-once,
    non-broadcast,
    network-transparent
    queue of messages

    View Slide

  18. http.request
    Protocol Server Worker Server
    http.response
    websocket.connect
    websocket.send
    websocket.receive
    websocket.send
    websocket.send

    View Slide

  19. Responses are on single-reader channels
    (http.response!1A2B3C)

    View Slide

  20. You can send onto channels from
    anywhere

    View Slide

  21. How do you use it?

    View Slide

  22. View
    request
    response
    callable

    View Slide

  23. Consumer
    event
    event
    callable
    event
    event

    View Slide

  24. Every message on a channel runs
    the consumer function

    View Slide

  25. http.request routes to a
    view system consumer

    View Slide

  26. def ws_message(message):
    # Get things from message
    data = json.loads(message['text'])
    # Use ORM like normal
    MyModel.objects.create(
    value=data['value'],
    )
    # Send a reply and close socket
    message.reply_channel.send({
    'text': 'OK',
    'close': True,
    })

    View Slide

  27. routing.py: urls.py for Channels

    View Slide

  28. message.user: like request.user

    View Slide

  29. message.channel_session:
    per-socket sessions

    View Slide

  30. Groups
    broadcast/pub-sub

    View Slide

  31. Add a channel to a Group
    Remove a channel from a Group
    Send to a Group

    View Slide

  32. Worked Examples
    github.com/andrewgodwin/channels-examples

    View Slide

  33. Liveblog
    http.request Django view layer
    websocket.connect Add to liveblog Group
    websocket.disconnect Remove from liveblog Group
    Send notification to liveblog

    View Slide

  34. Chat
    http.request Django view layer
    websocket.receive Either add to room Group
    or send to chat_messages
    websocket.disconnect Remove from room Groups
    chat_messages Send to room Groups

    View Slide

  35. It's so easy to join!
    CALL NOW

    View Slide

  36. Things I didn't even get to:
    Replacing WSGI
    Pluggable channel backends
    Sharding and scaling
    It's still just runserver

    View Slide

  37. A base for the future
    Scheduler?
    Retry logic?
    Generic Consumers?
    ...and much more

    View Slide

  38. 1.10
    "Provisional"?

    View Slide

  39. 1.8 1.9
    pip install channels

    View Slide

  40. channels.readthedocs.com
    github.com/andrewgodwin/channels-examples

    View Slide

  41. Thanks.
    Andrew Godwin
    @andrewgodwin

    View Slide