Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Architecting with Channels
Search
Andrew Godwin
July 19, 2016
Programming
2
1.2k
Architecting with Channels
My keynote from DjangoCon US 2016.
Andrew Godwin
July 19, 2016
Tweet
Share
More Decks by Andrew Godwin
See All by Andrew Godwin
Reconciling Everything
andrewgodwin
1
350
Django Through The Years
andrewgodwin
0
260
Writing Maintainable Software At Scale
andrewgodwin
0
470
A Newcomer's Guide To Airflow's Architecture
andrewgodwin
0
380
Async, Python, and the Future
andrewgodwin
2
700
How To Break Django: With Async
andrewgodwin
1
760
Taking Django's ORM Async
andrewgodwin
0
750
The Long Road To Asynchrony
andrewgodwin
0
700
The Scientist & The Engineer
andrewgodwin
1
800
Other Decks in Programming
See All in Programming
生成AIを利用するだけでなく、投資できる組織へ
pospome
1
300
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
400
AIコーディングエージェント(Manus)
kondai24
0
170
これだけで丸わかり!LangChain v1.0 アップデートまとめ
os1ma
6
1.8k
エディターってAIで操作できるんだぜ
kis9a
0
710
Integrating WordPress and Symfony
alexandresalome
0
150
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
150
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
2.1k
Go コードベースの構成と AI コンテキスト定義
andpad
0
120
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
230
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
130
TypeScript 5.9 で使えるようになった import defer でパフォーマンス最適化を実現する
bicstone
1
1.3k
Featured
See All Featured
How to Ace a Technical Interview
jacobian
280
24k
The Invisible Side of Design
smashingmag
302
51k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
Embracing the Ebb and Flow
colly
88
4.9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
Producing Creativity
orderedlist
PRO
348
40k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
96
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
970
Measuring & Analyzing Core Web Vitals
bluesmoon
9
700
Transcript
None
Andrew Godwin Hi, I'm Django core developer Senior Software Engineer
at Used to complain about migrations a lot
2010
WebSockets
WebSockets (and Eventlet)
2012
None
2014
"django-onair"
2015
Channels
Born from WebSockets
Born from WebSockets Expanded to be more
The "real hard problem"
Asynchronous coordination
Why?
WebSockets don't magically solve everything
Architecture is about tradeoffs
Bidirectional, low overhead Complex client-side, compatibility CONS PROS
Streaming updates Chat applications Collaborative editing Game backends
Broadcast
Server Client 1 Client 2 Client 3 Client 4
Server Client 1 Client 2 Client 3 Client 4 Server
Server Client 1 Client 2 Client 3 Client 4 Server
The "hard problem"
Channels is a foundation for runnng 'async' at scale
WebSockets Task offloading Chat/Email integration IoT protocols
What makes it hard?
Stateful connections Internal network Bottlenecks
Server Server Django Script ASGI "Send to channel X" "Receive
from channel X" "Send to group Y" "Add channel X to group Y" "Remove channel X from group Y"
Server Server Django Script ASGI ASGI ASGI ASGI Redis
Server Server Django Script ASGI ASGI ASGI ASGI Shared Memory
Server Server Django Script ASGI ASGI ASGI ASGI Shared Memory
Redis Redis
bit.ly/asgi-spec
Channels wraps the low-level ASGI operations
Think of it as the "Django bit" of a larger
whole.
Daphne HTTP/WebSocket Server Channels Django integration asgi-redis Redis backend asgi-ipc
Local memory backend asgiref Shared code and libs
What does Channels provide? Routing Consumers Sessions Auth Helpers By
channel, URL, etc. Standardised message handling Cross-network persistence on sockets Including HTTP cookies on WebSocket runserver, runworker, debugging info
Putting it to use Let's make a chat!
Consumers def on_connect(message): Group("chat").add(message.reply_channel) def on_receive(message): Group("chat").send({"text": message["text"]}) def on_disconnect(message):
Group("chat").discard(message.reply_channel) websocket.connect websocket.receive websocket.disconnect
Routing from channels import route routing = [ route("websocket.connect", on_connect),
route("websocket.receive", on_receive), route("websocket.disconnect", on_disconnect) ]
Class-based from channels import route_class routing = [ route_class(ChatConsumer), ]
from channels.generic.websockets class ChatConsumer(WebsocketConsumer): def connection_groups(self): return ["chat"] def receive(self, text): self.group_send("chat", text=text) Routing
Full worked example github.com/andrewgodwin/channels-examples
Liveblog
Liveblog
Data Binding Multiplexing &
class IntegerValue(models.Model): name = models.CharField(max_length=100, unique=True) value = models.IntegerField(default=0) class
IntegerValueBinding(WebsocketBinding): model = IntegerValue stream = "intval" def check_permission(self, user, action, instance): return True def group_names(self, instance, action): return ["binding.values"]
Demo Do I dare?
More in channels-examples!
Custom Protocols
Decompose into messages Email email.send, email.receive Slack slack.receive, slack.send, slack.joined,
... MQTT mqtt.subscribe, mqtt.unsubscribe, mqtt.send, ...
Write a custom server Use asyncio, Twisted, Gevent, etc Server
takes path to ASGI channel layer instance (CLI/config file) Roll layer.send, layer.receive_many into your event loop
Write Django consumers Same codebase as the main project Optional
routing/per-worker channel limiting
IRC Worker ASGI Worker Worker Email MQTT Scheduler HTTP/WS Custom
Daemon
Channels is a tool for you to use
There's more to be done (and some funding for it)
1995 You are a desktop app 2005 You are a
website 2015 You are a rich web/mobile app 2025 ?
What are the goals of a framework? Do we adapt?
Let's keep Django and Python a great choice for complex
backends
Thanks. Andrew Godwin @andrewgodwin channels.readthedocs.io github.com/andrewgodwin/channels-examples