上图可以看成 Daphne + Django 的请求处理逻辑
- Interface server 将 HTTP 和 WebSocket 封装成符合 ASGI 协议的格式(scope),对应的是 Daphne 服务
- CHANNEL LAYER 对应是 Redis 消息中间件,缓存所有的 HTTP 和 WebSocket 请求
- WORKER PROCESS 对应为 Django 应用,其中的 Channels 组件不断监听 CHANNEL LAYER,并拉取其中的 ASGI 请求。首先 Django 中的 channels.routing 会先鉴定 ASGI 请求的协议类型,然后将 WebSocket 分发到对应的 Consumer,并将 HTTP 分发到对应的视图函数
如果按照最后 Nginx + Gunicorn + Daphne + Django 的方式部署的话,对应的请求处理应该如下图:
另外既然 Daphne 可以处理 HTTP+websocket,那为什么还要使用 Gunicorn 独立处理 HTTP 呢?