在负载均衡器后面运行多个daphne实例:django通道



我正在使用django-channels添加HTTP2&WebSocket支持我的应用程序。我找不到很多关于如何扩展渠道的文档。下面是我的nginx配置,它负载平衡在同一台机器上但不同端口上运行的daphne的多个实例。这是正确的方法吗?

upstream socket {
least_conn;
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}
server {
listen 80;
server_name 127.0.0.1;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/niscp/home-screen;
}
location /nicons/ {
root /home/niscp/home-screen;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/home/niscp/home-screen/home-screen.sock;
}
location /ws/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://socket;
}
}

除此之外,我正在运行workers的各个实例,以以下方式侦听各个通道:

python manage.py runworker --only-channels=websocket.connect
python manage.py runworker --only-channels=websocket.receive
python manage.py runworker --only-channels=websocket.disconnect

我让uwsgidjango正常处理所有http请求的方式处理它们。daphneworkers所做的只是处理WebSocket请求。这是一种可行的django-channels缩放方法吗?或者我可以做得更好吗?

这里有一些东西。首先,我认为在不同的进程中运行不同类型的请求不会有多大好处。您的断开连接处理程序可能会非常轻——除了清理之外,不会做太多工作。Connect可能也没有多大作用,而receive将获得大部分负载。

使用--threads参数并启动多个线程是值得下注的。您当前的设置只会为每种类型的处理程序运行一个线程。

runworker的工作方式是通过您的通道层(例如Redis)与Daphne进行通信。所有的工人都在排队等候。当请求传入时,一个工作人员将处理该请求。当该工作人员处理该请求时,其他工作人员将等待后续请求并进行处理。一旦他们发送了响应,他们就会返回到侦听队列。如果没有指定通道,则每个进程都会提取请求并以最快的速度处理它们,并且没有一个进程在等待。

您可以通过运行多个进程和--threads参数来找到线程/工作线程的最佳平衡。你也可以为重型频道保留工作人员,这样他们就不会破坏你的网站。

拥有多个Daphne实例会有所帮助。但是,由于它们所做的只是在服务器和工作人员之间发送消息,您可能看不到运行其中4个的好处。

此处所述内容不适用于Channel 2。这是Django频道的旧版本

最新更新