运行 负载均衡器后面的多个 daphne 实例:django-channels
Running multiple instances of daphne behind a load balancer: 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
我已经 uwsgi
以 django
通常处理它们的方式处理所有 http 请求。 daphne
和 workers
所做的只是处理 WebSocket
请求。
这是一种可行的扩展方法 django-channels
,还是我可以做得更好?
这里有几件事。首先,我认为 运行 在不同进程中处理不同类型的请求不会给您带来多大好处。您的断开连接处理程序可能会非常轻巧——除了清理之外不会做太多事情。 Connect 也可能不会做太多事情,而 receive 将承担大部分负载。
您打赌使用 --threads 参数并启动多个线程。您当前的设置只会 运行 每种类型的处理程序一个线程。
运行worker 的工作方式是它通过您的通道层(例如 Redis)与 Daphne 通信。所有的工人都在听一个队列。当一个请求进来时,一个工作人员将处理它。当该 worker 正在处理请求时,其他 worker 将等待后续请求并处理它们。一旦他们发送响应,他们就会返回收听队列。如果没有指定 --only-channels,每个进程将拉出请求并尽可能快地处理它们,其中 none 个将等待。
您可以通过 运行 多个进程和 --threads 参数找到 threads/workers 的最佳平衡点。您还可以为繁重的频道预留工作人员,这样他们就不会破坏您的网站。
拥有多个达芙妮实例会有所帮助。但是由于他们所做的只是在您的服务器和工作人员之间发送消息,您可能看不到 运行其中 4 个的好处。
此处所述的所有内容均不适用于 Channels 2。这是针对旧版本的 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
我已经 uwsgi
以 django
通常处理它们的方式处理所有 http 请求。 daphne
和 workers
所做的只是处理 WebSocket
请求。
这是一种可行的扩展方法 django-channels
,还是我可以做得更好?
这里有几件事。首先,我认为 运行 在不同进程中处理不同类型的请求不会给您带来多大好处。您的断开连接处理程序可能会非常轻巧——除了清理之外不会做太多事情。 Connect 也可能不会做太多事情,而 receive 将承担大部分负载。
您打赌使用 --threads 参数并启动多个线程。您当前的设置只会 运行 每种类型的处理程序一个线程。
运行worker 的工作方式是它通过您的通道层(例如 Redis)与 Daphne 通信。所有的工人都在听一个队列。当一个请求进来时,一个工作人员将处理它。当该 worker 正在处理请求时,其他 worker 将等待后续请求并处理它们。一旦他们发送响应,他们就会返回收听队列。如果没有指定 --only-channels,每个进程将拉出请求并尽可能快地处理它们,其中 none 个将等待。
您可以通过 运行 多个进程和 --threads 参数找到 threads/workers 的最佳平衡点。您还可以为繁重的频道预留工作人员,这样他们就不会破坏您的网站。
拥有多个达芙妮实例会有所帮助。但是由于他们所做的只是在您的服务器和工作人员之间发送消息,您可能看不到 运行其中 4 个的好处。
此处所述的所有内容均不适用于 Channels 2。这是针对旧版本的 Django Channels。