我在用django-channels
to add 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
处理所有http请求的方式django
通常会处理它们。全部daphne
and workers
做的是处理WebSocket
要求。
这是一种可行的扩展方法吗django-channels
,或者有什么我可以做得更好的吗?
这里有一些事情。首先,我认为在不同进程中运行不同类型的请求不会带来太多好处。您的断开连接处理程序可能会非常轻 - 除了清理之外不会做太多事情。连接可能也不会做太多事情,而接收将获得大部分负载。
您正在押注使用 --threads 参数并启动多个线程。您当前的设置只会为每种类型的处理程序运行一个线程。
runworker 的工作方式是通过通道层(例如 Redis)与 Daphne 进行通信。所有的工作人员都在监听队列。当请求到来时,一名工作人员将处理它。当该工作人员正在处理请求时,其他工作人员将等待后续请求并处理它们。一旦他们发送了响应,他们就会回去监听队列。如果没有指定 --only-channels ,每个进程都会拉出请求并尽快处理它们,并且没有一个进程会等待。
您可以通过运行多个进程和 --threads 参数来找到线程/工作线程的最佳平衡。您还可以为繁忙的频道保留工作人员,这样他们就不会破坏您的网站。
拥有多个 Daphne 实例会有所帮助。但由于它们所做的只是在您的服务器和工作人员之间发送消息,因此您可能看不到运行 4 个它们的好处。
这里开始的一切不适用于 Channels 2。这是针对旧版本的 Django Channels。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)