在负载均衡器后面运行daphne的多个实例:django-channels

时间:2017-10-16 06:59:55

标签: python django nginx django-channels

我正在使用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的可行方法,还是我可以做得更好?

1 个答案:

答案 0 :(得分:1)

这里有一些事情。首先,我认为在不同的流程中运行不同类型的请求会让您看到很多好处。您的断开连接处理器可能会非常轻 - 除了清理之外没有做太多工作。连接可能也不会做太多,接收将获得大部分负载。

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

runworker的工作方式是它通过您的渠道层与Daphne进行通信(来自Redis)。所有工人都在听队列。当请求进来时,一个工作人员将处理它。当该工作人员正在处理请求时,其他工作人员将等待后续请求并处理它们。一旦他们发送了他们的回复,他们就会回去听队列。如果没有指定--only-channels,则每个进程都会提取请求并尽可能快地处理它们,并且它们都不会等待。

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

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

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