Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Channels (Under The Hood)
Search
Andrew Godwin
November 03, 2016
Programming
7.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Channels (Under The Hood)
A talk I gave at Django Under The Hood 2016.
Andrew Godwin
November 03, 2016
Transcript
55 slides
None
Andrew Godwin Hi, I'm Django core developer Senior Software Engineer
at Used to complain about migrations a lot
It's magic.
It's magic.
The Problem 1
The Web is changing.
WebSockets
WebSockets WebRTC Long-polling MQTT Server-Sent Events
Python is synchronous. Django is synchronous.
Synchronous code is easier to write. Single-process async is not
enough.
Proven design pattern Not too hard to reason about
What could fit these constraints?
Loose Coupling 2
Not too tied to WebSockets Not too tied to Django
Well-defined, minimal interfaces
Easy to swap out or rewrite
The Message Bus HTTP Server Message Bus WSock Server Django
Project
What do you send? How do you send it?
ASGI
nonblocking send blocking receive add to group discard from group
send to group
JSON-compatible, dictionary-based messages onto named channels
Concrete Ideas 3
Develop using concrete examples
WebSocket connect receive disconnect accept/reject send
WebSocket websocket.connect websocket.send!abc1234 websocket.receive websocket.disconnect
At-most-once First In First Out Backpressure via capacity Not sticky
No guaranteed ordering No serial processing
HTTP & WS Channel Layer Django Worker HTTP & WS
Django Worker Django Worker Django Worker
{ "text": "Hello, world!", "path": "/chat/socket/", "reply_channel": "websocket.send!9m12in2p", }
Developed and spec'd HTTP WebSocket Rough drafts IRC Email Slack
Please, no. Minecraft Mainframe Terminal
{ "reply_channel": "http.response!g23vD2x5", "method": "GET", "http_version": "2", "path": "/chat/socket/", "query_string":
"foo=bar", "headers": [["cookie", "abcdef..."]], }
At-most-once First In First Out Backpressure via capacity Not sticky
No guaranteed ordering No serial processing
At-most-once First In First Out Backpressure via capacity Not sticky
No guaranteed ordering No serial processing
"order" key on receive messages Connection acceptance
Daphne HTTP/WebSocket Server Channels Django integration asgi-redis Redis backend asgi-ipc
Local memory backend asgiref Shared code and libs
Django-ish 4
It can take several tries to get a nice API.
Consumers based on Views Callable that takes an object Decorators
for functionality Class-based generics
@channel_session def chat_receive(message): name = message.channel_session["name"] message.reply_channel.send({"text": "OK"}) Group("chat").send({ "text":
"%s: %s" % (name, message["text"]), }) Message.objects.create( name=name, content=message["text"], )
Routing based on URLs List of regex-based matches Includes with
prefix stripping on paths More standardised interface
routing = [ route( "websocket.receive", consumers.chat_receive, path=r"^/chat/socket/$", ), include("stats.routing", path="^/stats/"),
route_class(ConsumerClass, path="^/v1/"), ]
Sessions are the only state Sessions hang off reply channels
not cookies Uses same sessions backends Available on the consumer's argument Can also access long-term cookie sessions
@enforce_ordering def receive_consumer(message): Log.objects.create(...)
session = session_for_reply_channel( message.reply_channel.name ) if not session.exists(session.session_key): try: session.save(must_create=True)
except CreateError: # Session wasn't unique raise ConsumeLater() message.channel_session = session
No Middleware New-style middleware half works No ability to capture
sends Decorators replace most cases
View/HTTP Django still there Can intermingle or just use one
type View system is just a consumer now
def view_consumer(message): replies = AsgiHandler()(message) for reply in replies: while
True: try: message.reply_channel.send(reply) except ChannelFull: time.sleep(0.05) else: break
Signals and commands runserver works as expected Signals for handling
lifecycle staticfiles configured for development
Beyond 5
Generalised async communication
Service messaging Security/CPU separation Sync & Async / Py2 &
Py3
Diversity of implementations More web servers More channel layers
More optimisation More efficient bulk sends Less network traffic on
receive
More maintainers More viewpoints, more time
1.0 coming soon Stable APIs for everything except binding
Thanks. Andrew Godwin @andrewgodwin channels.readthedocs.io github.com/andrewgodwin/channels-examples
More Decks by Andrew Godwin
See All by Andrew Godwin
Working With Risk: Lessons From Mountain Rescue
andrewgodwin
1
35
Reconciling Everything
andrewgodwin
1
430
Django Through The Years
andrewgodwin
0
350
Writing Maintainable Software At Scale
andrewgodwin
0
560
A Newcomer's Guide To Airflow's Architecture
andrewgodwin
0
450
Async, Python, and the Future
andrewgodwin
2
770
How To Break Django: With Async
andrewgodwin
1
860
Taking Django's ORM Async
andrewgodwin
0
890
The Long Road To Asynchrony
andrewgodwin
0
790
Other Decks in Programming
See All in Programming
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
850
Next.js: The final boss of Web Performance
guaca
0
400
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
180
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
170
Railsバージョンを4倍にした話
optim
0
1k
GraphQL の onError と Nullability のこれから
quramy
0
210
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
330
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
340
はじめてのPLATEAU
nokonoko1203
1
640
SODA - FACT BOOK(EN)
sodainc
1
230
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
3
1.7k
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
170
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
880
Done Done
chrislema
187
17k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Speed Design
sergeychernyshev
33
2.2k
What's in a price? How to price your products and services
michaelherold
247
13k
Faster Mobile Websites
deanohume
310
32k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
WCS-LA-2024
lcolladotor
0
990
Become a Pro
speakerdeck
PRO
31
6.4k
Side Projects
sachag
456
43k