Python Channels笔记--Deploying

三步:

1.创建一个channel后端

2.运行worker服务

3.运行接口服务

 

        可以两种方式设置:路由所有的通信到HTTP/WebSocket接口服务,完全不用WSGI服务;或者只路由WebSockets和长连接到接口服务。前者可以共用URL树,而后者需要设置一个webserverlayer 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

       没有必要重启WSGIWebSocket接口服务,除非你更新了他们或者改变了CHANNEL_LAYER设置。它们没有调用你的任何代码,所有的中间件和代码都运行在consumer上。甚至支持不同Python版本。

 

Running just ASGI

       ASGI和它的权威接口服务Daphne对你来说都很新鲜,所以你可能不希望让所有的信息都通过它(或者你正需要WSGI的特别功能)。

       没关系,DaphneWSGI可以同时运行。只需要设置loadbalancerfront HTTP server进程,基于pathdomainupgrade header。基于pathdomain意味着你需要小心地设计WebSocket URLs;较为理想的是通过upgradeWebSocket头区分,但并不是所有的软件都支持,他也对长连接没有作用。

       你也可以逆向思考,先默认导到Daphne在有选择地将一些信息路由到WSGI服务。

 

Running on a Paas

 

Scaling Up

你可能感兴趣的:(Python Channels笔记--Deploying)