繁体   English   中英

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

[英]Running multiple instances of daphne behind a load balancer: django-channels

我正在使用django-channels为我的应用程序添加HTTP2WebSocket支持。 我找不到很多关于如何扩展频道的文档。 下面是我的nginx配置, daphne运行在同一台机器但不同端口上的多个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

我有uwsgi来处理所有的 http 请求,就像django通常处理它们的方式。 daphneworkers所做的就是处理WebSocket请求。 这是扩展django-channels的可行方法,还是我可以做得更好?

这里有几件事。 首先,我认为在不同进程中运行不同类型的请求不会有太大好处。 您的断开连接处理程序可能会非常轻巧 - 除了清理之外不会做太多事情。 Connect 也可能不会做太多事情,而接收将获得大部分负载。

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

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

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

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

此处所述的所有内容均不适用于 Channels 2。这是针对旧版本的 Django Channels。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM