三步:
1.创建一个channel后端
2.运行worker服务
3.运行接口服务
可以两种方式设置:路由所有的通信到HTTP/WebSocket接口服务,完全不用WSGI服务;或者只路由WebSockets和长连接到接口服务。前者可以共用URL树,而后者需要设置一个webserver或layer 7 loadbalancer。
Settingup a channel backend
Runworker servers
每个worker服务都是单线程的,所以建议每个核运行一个或两个。开很多worker也安全,因为他们并不占用额外的端口。
Pythonmanage.py runwoker
可以为channel指定worker
python manage.py runworker --only-channels=http.*--only-channels=websocket.*
或让worker忽略消息
python manage.py runworker--exclude-channels=thumbnail
Runinterface servers
需要ASGI接口服务支持WebSocket。我们推荐使用附带的接口服务,Daphne。它不需要将WebSocket分配到不同的端口或路径(并且能够和你的view代码共享cookies)。
运行Daphne,只需要提供channel后端,先确保项目中有asgi.py文件。
import os
from channels.asgi import get_channel_layer
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
channel_layer = get_channel_layer()
然后你可以运行Daphne并且提供channel layer参数。
daphne my_project.asgi:channel_layer
像runworker一样,应该把它放在初始系统或管理者中确保意外退出时重启。
如果只运行Daphne而没有worker,所有的请求会悬挂。(runserver 也用Daphne,它在自己的进程中启动worker线程)。
Deploying new versions of code
一个解耦连接和工作进程的好处是,你可以运行新代码而不需要放弃客户端连接。当有新代码时,只需要重启worker,队列中的消息就会传向新的worker。
没有必要重启WSGI或WebSocket接口服务,除非你更新了他们或者改变了CHANNEL_LAYER设置。它们没有调用你的任何代码,所有的中间件和代码都运行在consumer上。甚至支持不同Python版本。
Running just ASGI
ASGI和它的权威接口服务Daphne对你来说都很新鲜,所以你可能不希望让所有的信息都通过它(或者你正需要WSGI的特别功能)。
没关系,Daphne和WSGI可以同时运行。只需要设置loadbalancer或front HTTP server进程,基于path,domain或upgrade header。基于path或domain意味着你需要小心地设计WebSocket URLs;较为理想的是通过upgrade:WebSocket头区分,但并不是所有的软件都支持,他也对长连接没有作用。
你也可以逆向思考,先默认导到Daphne在有选择地将一些信息路由到WSGI服务。
Running on a Paas
Scaling Up