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
Django, Channels, and Distributed Systems
Search
Andrew Godwin
August 21, 2016
Programming
790
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Django, Channels, and Distributed Systems
A talk I gave at PyBay 2016
Andrew Godwin
August 21, 2016
More Decks by Andrew Godwin
See All by Andrew Godwin
Reconciling Everything
andrewgodwin
1
410
Django Through The Years
andrewgodwin
0
340
Writing Maintainable Software At Scale
andrewgodwin
0
550
A Newcomer's Guide To Airflow's Architecture
andrewgodwin
0
430
Async, Python, and the Future
andrewgodwin
2
760
How To Break Django: With Async
andrewgodwin
1
840
Taking Django's ORM Async
andrewgodwin
0
870
The Long Road To Asynchrony
andrewgodwin
0
780
The Scientist & The Engineer
andrewgodwin
1
870
Other Decks in Programming
See All in Programming
iOSDCのペンライトを自動制御したい!
akkeylab
0
320
カツオ、ご期待ください
suneo3476
0
130
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.7k
iOSDC2026登壇資料.pdf
riofujimon
0
200
AHC070解法紹介
eijirou
0
150
Java 27新機能 / Java 27 new features
kishida
2
190
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
510
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
290
Webの地図
yosuke_furukawa
PRO
6
5k
AWSに止められる覚悟してますか?
morizo_1984
2
490
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
280
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
600
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
710
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
So, you think you're a good person
axbom
PRO
2
2.2k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
560
Become a Pro
speakerdeck
PRO
31
6.3k
New Earth Scene 8
popppiees
4
2.6k
Transcript
None
Andrew Godwin Hi, I'm Django core developer Senior Software Engineer
at Used to complain about migrations a lot
Channels
Born from WebSockets
Born from WebSockets Expanded to be more
The "real hard problem"
Asynchronous coordination
You take a request... ...and return a response.
HTTP 1 request response Browser Server request response request response
request response
HTTP 2 request response Browser Server request response request 1
response 2 request 2 response 1
WebSockets receive send Browser Server send receive send send receive
???
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"
Broadcast
We need to coordinate between servers
Channels is a foundation for runnng 'async' at scale
Architecture is about tradeoffs
At most once / At least once Ordered / Unordered
FIFO / FILO Expiry / Persistence
WebSockets Service-oriented Architecture Chat/Email integration IoT protocols
What makes it hard?
DISTRIBUTED SYSTEMS
Stateful connections Internal network Bottlenecks Machines dying
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
Ignoring Django
1. Take a channel layer daphne myproject.asgi:channel_layer
2. Tie it into an event loop Twisted, asyncio, or
while-True
3. Call send/receive It's a communication channel!
Example: SOA Services receive()-block waiting for tasks Clients use send()
with a reply-channel to call an endpoint Servers process and send() the reply
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)
The tradeoffs may not be for you! (Especially as you
specialise)
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?
Thanks. Andrew Godwin @andrewgodwin channels.readthedocs.io github.com/andrewgodwin/channels-examples